如何在matplotlib中移动刻度线的标签? [英] How to move a tick's label in matplotlib?
问题描述
我想沿x轴水平移动刻度线的标签,而不移动相应的刻度线.
I would like to move some ticks' labels horizontally along the x-axis, without moving the corresponding ticks.
更具体地说,当使用plt.setp
旋转标签时,标签文本的中心与刻度线保持对齐.我想将这些标签向右移动,以使标签的近端对齐,而不是如下图所示.
More specifically, when rotating labels with plt.setp
, the centers of the labels' text stay aligned with the ticks. I would like to shift those labels to the right, so that the near ends of the labels get aligned instead as suggested on the image below.
我知道这篇文章和
I am aware of this post and this one, however the answers are interesting kludges rather than strict answers to the question.
我的代码:
import matplotlib.pyplot as plt
import numpy as np
import datetime
# my fake data
dates = np.array([datetime.datetime(2000,1,1) + datetime.timedelta(days=i) for i in range(365*5)])
data = np.sin(np.arange(365*5)/365.0*2*np.pi - 0.25*np.pi) + np.random.rand(365*5) /3
# creates fig with 2 subplots
fig = plt.figure(figsize=(10.0, 6.0))
ax = plt.subplot2grid((2,1), (0, 0))
ax2 = plt.subplot2grid((2,1), (1, 0))
## plot dates
ax2.plot_date( dates, data )
# rotates labels
plt.setp( ax2.xaxis.get_majorticklabels(), rotation=-45 )
# try to shift labels to the right
ax2.xaxis.get_majorticklabels()[2].set_y(-.1)
ax2.xaxis.get_majorticklabels()[2].set_x(10**99)
plt.show()
奇怪的是,set_y
的行为符合预期,但是即使我将x
设置为幻想,标签也不会移动一个iota.
(使用plot_date
可能会引起更多的混乱,但实际上plot
也会发生同样的情况.)
Strangely enough, set_y
behaves as expected, but even if I set x
to a fantasillion, the labels would not move by one iota.
(The use of plot_date
may introduce additional confusion, but the same actually happens with plot
.)
推荐答案
首先,让我们使用mcve来显示问题.
First of all, let's use a mcve to show the problem.
import numpy as np
import datetime
import matplotlib.pyplot as plt
plt.rcParams["date.autoformatter.month"] = "%b %Y"
# my fake data
dates = np.array([datetime.datetime(2000,1,1) + datetime.timedelta(days=i) for i in range(365)])
data = np.sin(np.arange(365)/365.0*2*np.pi - 0.25*np.pi) + np.random.rand(365) /3
# creates fig with 2 subplots
fig, ax = plt.subplots(figsize=(6,2))
## plot dates
ax.plot_date( dates, data )
# rotates labels
plt.setp( ax.xaxis.get_majorticklabels(), rotation=-45 )
plt.tight_layout()
plt.show()
现在,正如其他答复所指出的那样,您可以使用文本的水平对齐方式.
Now as other anwers pointed out already, you may use horizontal alignment of the text.
# rotates labels and aligns them horizontally to left
plt.setp( ax.xaxis.get_majorticklabels(), rotation=-45, ha="left" )
您可以使用rotation_mode
参数让旋转在文本的左上角发生,在这种情况下,结果会更好一些.
You may use the rotation_mode
argument to let the rotation happen about the top left point of the text, giving a slightly nicer result in this case.
# rotates labels and aligns them horizontally to left
plt.setp( ax.xaxis.get_majorticklabels(), rotation=-45, ha="left", rotation_mode="anchor")
如果这些选项的粒度不够细,即您想更准确地放置标签,例如将其向一侧移动一些点,您可以使用变换.以下将使用matplotlib.transforms.ScaledTranslation
在水平方向上将标签偏移5个点.
In case those options are not fine grained enough, i.e. you want to position the labels more accurately, e.g. shifting it to the side by some points, you may use a transform. The following would offset the label by 5 points in horizontal direction, using a matplotlib.transforms.ScaledTranslation
.
import matplotlib.transforms
plt.setp( ax.xaxis.get_majorticklabels(), rotation=-45)
# Create offset transform by 5 points in x direction
dx = 5/72.; dy = 0/72.
offset = matplotlib.transforms.ScaledTranslation(dx, dy, fig.dpi_scale_trans)
# apply offset transform to all x ticklabels.
for label in ax.xaxis.get_majorticklabels():
label.set_transform(label.get_transform() + offset)
与例如@explorerDude提供的解决方案是,偏移量独立于图形中的数据,因此它通常适用于任何绘图,并且对于给定的字体大小,其外观将相同.
The advantage of this, compared to e.g. the solution provided by @explorerDude is that the offset is independent on the data in the graph, such that it is generally applicable to any plot and would look the same for a given fontsize.
这篇关于如何在matplotlib中移动刻度线的标签?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!