python - 如何在 matplotlib 中移动刻度标签

标签 python matplotlib label

我想沿 x 轴水平移动一些刻度的标签,而不移动相应的刻度。

更具体地说,当使用 plt.setp 旋转标签时,标签文本的中心与刻度线保持对齐。我想将这些标签向右移动,以便标签的近端对齐,而不是如下图所示。

enter image description here

我知道this postthis one ,但是答案是有趣的组合,而不是对问题的严格答案。

我的代码:

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 设置为 fantasillion,标签也不会移动一分之一。 (使用 plot_date 可能会带来额外的困惑,但实际上 plot 也是如此。)

最佳答案

首先,让我们使用 mcve 来说明问题。

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()

enter image description here

现在正如其他答案已经指出的那样,您可以使用文本的水平对齐方式。

# rotates labels and aligns them horizontally to left 
plt.setp( ax.xaxis.get_majorticklabels(), rotation=-45, ha="left" )

enter image description here

您可以使用 rotation_mode 参数让旋转发生在文本的左上角,在这种情况下会产生更好的结果。

# rotates labels and aligns them horizontally to left 
plt.setp( ax.xaxis.get_majorticklabels(), rotation=-45, ha="left", rotation_mode="anchor") 

enter image description here

如果这些选项不够精细,即您希望更准确地定位标签,例如将它移到一边,您可以使用变换。以下将使用 matplotlib.transforms.ScaledTranslation 将标签在水平方向上偏移 5 个点。

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)

enter image description here

与例如相比,这样做的优势@explorerDude 提供的解决方案是偏移量独立于图表中的数据,因此它通常适用于任何绘图并且对于给定的字体大小看起来相同。

关于python - 如何在 matplotlib 中移动刻度标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28615887/

相关文章:

python - 迭代从 excel 文件列创建的 pandas 数据框时出错

python - Python 中将 boolean 值设置为 False(如果为 True,如果为 False 则设置为 True)的最短方法

python - modulenotfounderror 没有名为 '_pywrap_tensorflow_internal' 的模块

r - 条形图位置上的ggplot标签

python - 在每行满足另一个条件后查找第一行有条件的行

python - 直方图位于下方和侧面的折线图

python - 如何使用 pyplot 绘制二进制值

python - 条形图 : How to choose color if value is positive vs value is negative

r - R 中的值标签?

css - 获取 GWT 标签的计算字体大小