matplotlib 在坐标轴上有刻度,而不是[或不仅]在绘制曲线的方框的左侧和底部[复制]

ddhy6vgd  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(126)

此问题已在此处有答案

How to draw axis in the middle of the figure?(6个回答)
How to add minor ticks(1个答案)
上个月关门了。
使用 pandas 模块,我在一个 * 字节 * 的笔记本上画了一条曲线:

为了画出这个,我写了这个代码:

import pylab as pl
from numpy import *

pl.style.use('bmh')

# Df = ℝ - {-1, 1}
Df1 = [-4 + k/10 for k in range(28)] # [-4, -1[ par pas de 0.1
Df2 = [-0.8 + k/10 for k in range(18)] # ]-1, 1] par pas de 0.1
Df3 = [1.1 + k/10 for k in range(30)] # ]-1, 4] par pas de 0.1
Df = [Df1, Df2, Df3]

for D in Df:
   Y = [(-(x ** 2) + 2 * x) / (x ** 2 - 1) for x in D] # Pour tout x ∈ D, calculer y = f(x)
   pl.plot(D, Y, color='red')

pl.legend([ r'$\mathscr{C}_f$'], fontsize = 18) # Cet appel est important : sans, la légende ne s'affichera pas

# Axe des x : de -4 à 4, axe des y : de -6 à 6
pl.axis(xmin=-4, xmax=4, ymin=-6, ymax=6)
pl.axvline(x = 0)
pl.axhline(y = 0)

我想看到轴上的刻度,
而不是[或也添加到]他们目前所在的框的左侧和底部。
有可能吗?

sbdsn5lh

sbdsn5lh1#

您正在寻找matplotlib中的控制tick和spines,这在您发布的代码中使用。首先,尝试让零轴包含tick和label(引用在我添加的最后大约三行的注解中):

import pylab as pl
from numpy import *

pl.style.use('bmh')

# Df = ℝ - {-1, 1}
Df1 = [-4 + k/10 for k in range(28)] # [-4, -1[ par pas de 0.1
Df2 = [-0.8 + k/10 for k in range(18)] # ]-1, 1] par pas de 0.1
Df3 = [1.1 + k/10 for k in range(30)] # ]-1, 4] par pas de 0.1
Df = [Df1, Df2, Df3]

for D in Df:
   Y = [(-(x ** 2) + 2 * x) / (x ** 2 - 1) for x in D] # Pour tout x ∈ D, calculer y = f(x)
   pl.plot(D, Y, color='red')

pl.legend([ r'$\mathscr{C}_f$'], fontsize = 18) # Cet appel est important : sans, la légende ne s'affichera pas

# Axe des x : de -4 à 4, axe des y : de -6 à 6
pl.axis(xmin=-4, xmax=4, ymin=-6, ymax=6)
pl.axvline(x = 0)
pl.axhline(y = 0)
pl.gca().minorticks_on() # based on https://stackoverflow.com/a/57280702/8508004
pl.gca().spines['bottom'].set_position('zero') #based on https://stackoverflow.com/a/31054289/8508004
pl.gca().spines['left'].set_position('zero');  #based on https://stackoverflow.com/a/31054289/8508004

下面是该代码的结果:

如果您希望零轴更多地是由axvline()axfline()添加的纯色,则可以进一步调整该方法,以使轴的颜色与这些线匹配,如下所示:

import pylab as pl
from numpy import *

pl.style.use('bmh')

# Df = ℝ - {-1, 1}
Df1 = [-4 + k/10 for k in range(28)] # [-4, -1[ par pas de 0.1
Df2 = [-0.8 + k/10 for k in range(18)] # ]-1, 1] par pas de 0.1
Df3 = [1.1 + k/10 for k in range(30)] # ]-1, 4] par pas de 0.1
Df = [Df1, Df2, Df3]

for D in Df:
   Y = [(-(x ** 2) + 2 * x) / (x ** 2 - 1) for x in D] # Pour tout x ∈ D, calculer y = f(x)
   pl.plot(D, Y, color='red')

pl.legend([ r'$\mathscr{C}_f$'], fontsize = 18) # Cet appel est important : sans, la légende ne s'affichera pas

# Axe des x : de -4 à 4, axe des y : de -6 à 6
pl.axis(xmin=-4, xmax=4, ymin=-6, ymax=6)
pl.axvline(x = 0)
pl.axhline(y = 0)
pl.gca().minorticks_on() # based on https://stackoverflow.com/a/57280702/8508004
pl.gca().spines['bottom'].set_position('zero') #based on https://stackoverflow.com/a/31054289/8508004
pl.gca().spines['left'].set_position('zero')  #based on https://stackoverflow.com/a/31054289/8508004
pl.gca().spines['bottom'].set_color('tab:blue') # based on https://stackoverflow.com/a/4762002/8508004
pl.gca().spines['left'].set_color('tab:blue') # based on https://stackoverflow.com/a/4762002/8508004
#pl.gca().xaxis.label.set_color('black') #  # not needed(?), also comes from https://stackoverflow.com/a/4762002/8508004
#pl.gca().tick_params(axis='x', colors='tab:blue') # not needed(?), also comes from https://stackoverflow.com/a/4762002/8508004 ;

该代码块的结果可以说是上述代码块的“更精致”版本:

基于原始的帖子标题和文本,我以为你的意思是让刻度不只是在左边和底部。对于其他人在这里结束的问题,尝试下面的方法来获得图的所有轴上的刻度(它所基于的资源在添加的五行的评论中):

import pylab as pl
from numpy import *

pl.style.use('bmh')

# Df = ℝ - {-1, 1}
Df1 = [-4 + k/10 for k in range(28)] # [-4, -1[ par pas de 0.1
Df2 = [-0.8 + k/10 for k in range(18)] # ]-1, 1] par pas de 0.1
Df3 = [1.1 + k/10 for k in range(30)] # ]-1, 4] par pas de 0.1
Df = [Df1, Df2, Df3]

for D in Df:
   Y = [(-(x ** 2) + 2 * x) / (x ** 2 - 1) for x in D] # Pour tout x ∈ D, calculer y = f(x)
   pl.plot(D, Y, color='red')

pl.legend([ r'$\mathscr{C}_f$'], fontsize = 18) # Cet appel est important : sans, la légende ne s'affichera pas

# Axe des x : de -4 à 4, axe des y : de -6 à 6
pl.axis(xmin=-4, xmax=4, ymin=-6, ymax=6)
pl.axvline(x = 0)
pl.axhline(y = 0)
pl.gca().minorticks_on() # based on https://stackoverflow.com/a/57280702/8508004
pl.gca().yaxis.set_ticks_position('both')# Ticks on all 4 sides; based on https://stackoverflow.com/a/56577545/8508004                                                                                                                                                                                                                                 
pl.gca().xaxis.set_ticks_position('both') # based on https://stackoverflow.com/a/56577545/8508004
pl.gca().xaxis.set_tick_params(which='both', direction = 'in')# ticks facing inward direction based on https://stackoverflow.com/q/71366709/8508004
pl.gca().yaxis.set_tick_params(which='both', direction = 'in')# ticks facing inward based on https://stackoverflow.com/q/71366709/8508004;

下面代码块的结果:

相关问题