我想使用以下代码在X轴上绘制一个带有许多刻度的图形:
import pylab
N = 100
data = pylab.np.linspace(0, N, N)
pylab.plot(data)
pylab.xticks(range(N)) # add loads of ticks
pylab.grid()
pylab.tight_layout()
pylab.show()
pylab.close()
结果情节如下所示:
正如你所看到的,X轴是一团糟,因为刻度标签的绘制空间太小,甚至重叠。
我想在每个刻度标签之间自动创建恒定的空间,无论有多少刻度。因此,我希望增加单个刻度之间的空间,从而可能增加长度'情节。
请注意,刻度标签可能是可变长度的字符串。
到目前为止我发现的全部内容都是关于spacing between the axis and labels(这不是我想要的),tick frequency(我已经可以做)和tick parameters(其中包括{39}}似乎有间距的任何选择。
我可以用matplotlib.pyplot.figure(figsize=(a, b))
手动更改图形的大小,但这需要知道刻度之间的默认间距(据我所知,没有)和最大宽度(以英寸为单位的刻度标签,我不知道如何衡量,所以这不是我的选择。
我可以做些什么来增加蜱之间的间距?我可以获得一张相当长的图像。
答案 0 :(得分:11)
刻度标签之间的间距完全取决于轴上刻度之间的间距。因此,在给定的ticklabel之间获得更多空间的唯一方法是使轴更大。
为了确定标签不重叠所需的空间,可以找出最大的标签,并将其长度乘以滴答标签的数量。然后,可以调整轴周围的边距,并将计算出的尺寸设置为新的图形尺寸。
import numpy as np
import matplotlib.pyplot as plt
N = 150
data = np.linspace(0, N, N)
plt.plot(data)
plt.xticks(range(N)) # add loads of ticks
plt.grid()
plt.gca().margins(x=0)
plt.gcf().canvas.draw()
tl = plt.gca().get_xticklabels()
maxsize = max([t.get_window_extent().width for t in tl])
m = 0.2 # inch margin
s = maxsize/plt.gcf().dpi*N+2*m
margin = m/plt.gcf().get_size_inches()[0]
plt.gcf().subplots_adjust(left=margin, right=1.-margin)
plt.gcf().set_size_inches(s, plt.gcf().get_size_inches()[1])
plt.savefig(__file__+".png")
plt.show()
请注意,如果绘图窗口中显示的图形大于屏幕,则它将再次缩小,因此调整后的图形仅在保存时以新的大小显示。或者,可以选择将其合并到带有滚动条的某个窗口中,如此问题所示:Scrollbar on Matplotlib showing page
答案 1 :(得分:0)
这是一个老问题,但对于任何搜索的人来说,有一种方法:ticker.MaxNLocator(以及那里的其他定位器)。无论缩放大小如何,它最多可以在图形上放置 N 个刻度。
答案 2 :(得分:-1)
您可以使用以下内容旋转标签并缩小字体:
ax.set_xticklabels(rotation = (45), fontsize = 10, va='bottom', ha='left')