如何仅移动刻度标签(不移动相应的刻度线)?

时间:2013-04-23 06:32:43

标签: matplotlib

我正在使用matplotlib生成图表,我使用set_ticksset_ticklabels来标记x轴上的几个重要值。但是这些标签中的一些太靠近并且重叠。但我不知道如何在不移动刻度的情况下移动这些标签。

以下是插图:

overlapped tick labels

我尝试了几个技巧但失败了,我在互联网上找不到这个问题的答案。任何帮助,谢谢。


更新

源代码:

fig = mpl.figure( figsize=(3, 3) )              # force figsize here to reproduce the problem.
ax = fig.add_subplot(1, 1, 1, frameon=False)
ax.set_xlim(-0.015, 1.515)
ax.set_ylim(-0.01, 1.01)
ax.set_xticks([0, 0.3, 0.4, 1.0, 1.5])
ax.grid(True)
mpl.show()

结果:

enter image description here

我尝试过几个技巧,最好的一个是:

fig = mpl.figure( figsize=(3, 3) )
ax = fig.add_subplot(1, 1, 1, frameon=False)
ax.set_xlim(-0.015, 1.515)
ax.set_ylim(-0.01, 1.01)
ax.set_xticks([0, 0.3, 0.4, 1.0, 1.5])
ax.set_xticklabels([0.0, "", "", 1.0, 1.5])
ax.set_xticks([0.35], minor=True)
ax.set_xticklabels(["0.3 0.4"], minor=True)
ax.grid(True)
mpl.show()

enter image description here

但是在x = 0.35处有一个小问题,我不知道如何删除它。


更新2:

好的,我找到了自己删除小蜱的方法:

for line in ax.xaxis.get_minorticklines():
    line.set_visible(False)

通过这种方式,我们可以利用次要刻度将刻度标签放在我们想要的任何地方。

感谢所有人的热心!

3 个答案:

答案 0 :(得分:9)

对于寻找原始问题答案的人: 可以选择更改tick_label的对齐方式。

这在matplotlib网页上的example中有详细解释。基本上在上面的情况下,人们会使用

ax.get_xaxis().majorTicks[1].label1.set_horizontalalignment('right')
ax.get_xaxis().majorTicks[2].label1.set_horizontalalignment('left')

将标签彼此移开

答案 1 :(得分:8)

从您的评论“..标记x轴上的几个重要值”我认为您不应该更改xticks和标签,而是添加带有适当注释的垂直线。

这意味着您的数据保持规律并允许您着色重要点的网格,您也可以相当容易地添加数值。

实施例

import pylab as py

# Plot a sinc function
delta=2.0
x=py.linspace(-10,10,100)
y=py.sinc(x-delta)

# Mark delta
py.axvline(delta,ls="--",color="r")
py.annotate(r"$\delta$",xy=(delta+0.2,-0.2),color="r",size=15)
py.plot(x,y) 

Simple sinc and annotation

答案 2 :(得分:4)

作为对问题的严格回答,您可以获得特定的勾选并使用set_pad()

ax.get_xaxis().majorTicks[2].set_pad()

我认为更好的做法是使用autofmt_xdate

fig = plt.figure()
fig.autofmt_xdate()

它可以很好地旋转xtick标签,并且允许大多数文本很好地适应而不会重叠 如果它们仍然重叠 - 这意味着那些刻度非常接近。然后出现的问题是,如此紧密地联系在一起对你的情节的观众有什么好处呢?