我想在轴上最后一个刻度位置之前和之后留出一些空格。我只会使用axis.set_xlim()
,但这会干扰我的(自定义)定位器并重新生成刻度线生成。我找到并覆盖了定位器类的view_limits()
方法,但它们似乎没有被自动调用,并且在手动调用时它们对结果图没有任何影响。我搜索了文档和源代码但没有找到解决方案。我错过了什么吗?
为了获得更大的图片,我希望有一个定位器,它在刻度线之前和之后给我一些空间,并选择像“MultipleLocator”那样是“基数”倍数的刻度点,但如果刻度数超过a,则自动缩放基数指定值。如果有另一种方法来实现这一点而没有子类化定位器,我很满意:)。
以下是带有覆盖view_limits
的子类定位器的示例代码 - 方法:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MaxNLocator
class MyLocator(MaxNLocator):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def view_limits(self, dmin, dmax):
bins = self.bin_boundaries(dmin, dmax)
step = bins[1] - bins[0]
result = np.array([bins[0] - step, bins[-1] + step])
print(result)
return result
a = 10.0
b = 99.0
t = np.arange(a, b, 0.1)
s = np.sin(0.1*np.pi*t)*np.exp(-t*0.01)
loc = MyLocator(9)
fig, ax = plt.subplots()
plt.plot(t, s)
ax.xaxis.set_major_locator(loc)
loc.autoscale() # results in [ 0. 110.] but doesnt change the plot
plt.show()
答案 0 :(得分:0)
不确定,如果我完全理解你的问题是什么,但如果你只想增加额外的空间,你仍然可以使用MaxNLocator并像这里一样手动添加空间:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MaxNLocator
a = 10.0
b = 99.0
t = np.arange(a, b, 0.1)
s = np.sin(0.1*np.pi*t)*np.exp(-t*0.01)
loc = MaxNLocator(9)
fig, ax = plt.subplots()
plt.plot(t, s)
ax.xaxis.set_major_locator(loc)
ticks = ax.get_xticks()
newticks = np.zeros(len(ticks)+2)
newticks[0] = ticks[0]- (ticks[1]-ticks[0])
newticks[-1] = ticks[-1]+ (ticks[1]-ticks[0])
newticks[1:-1] = ticks
ax.set_xticks(newticks)
plt.show()
答案 1 :(得分:0)
为避免在图的边缘附近出现刻度线,一种略为棘手的解决方案如下:
class PaddedMaxNLocator(mp.ticker.MaxNLocator):
def __init__(self, *args, protected_width=0.25, **kwargs):
# `prune` edge ticks that might now become visible
super().__init__(*args, **kwargs, prune='both')
# Clamp to some reasonable range
self.protected_width = min(0.5, protected_width)
def tick_values(self, vmin, vmax):
diff = (vmax - vmin) * self.protected_width / 2
return super().tick_values(vmin + diff, vmax - diff)