当前位置: 首页 > 知识库问答 >
问题:

如何在matplotlib中移动刻度标签

徐焱
2023-03-14

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

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

我知道这篇文章和这篇文章,但是答案是有趣的乱七八糟的,而不是对这个问题的严格回答。

我的代码:

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设置为一个幻想,标签也不会移动一点。(使用plot\u date可能会引起额外的混淆,但在plot中也会发生同样的情况)


共有3个答案

丰博
2023-03-14

我找到了一种方法,可以任意精确地移动x轴的刻度标签,但这种方法危险地靠近耸立在疯狂之海之上的陡峭滑溜的悬崖。所以只有非常勇敢或绝望的人才应该继续读下去...

话虽如此,问题是标签的x位置是在绘制时设置的(我没有研究代码的这部分,但这是我的理解)。因此,您使用set_x()所做的一切稍后都会被重写。然而,有一种方法可以解决这个问题:您可以为某些刻度set_x补丁,这样标签就不会绘制在渲染器想要绘制的地方:

import types
SHIFT = 10. # Data coordinates
for label in ax2.xaxis.get_majorticklabels():
    label.customShiftValue = SHIFT
    label.set_x = types.MethodType( lambda self, x: matplotlib.text.Text.set_x(self, x-self.customShiftValue ), 
                                    label, matplotlib.text.Text )

您可以仅对要移动的标签选择性地执行此操作,当然也可以对每个标签使用不同的移动。

如果有人知道如何在较低的疯狂水平上做到这一点,我会非常感兴趣...

易弘亮
2023-03-14

而不是

ax2.xaxis.get_majorticklabels()[2].set_y(-.1)
ax2.xaxis.get_majorticklabels()[2].set_x(10**99)

对轴上的每个记号使用设置水平对齐()

for tick in ax2.xaxis.get_majorticklabels():
    tick.set_horizontalalignment("left")

导致:

柴阳云
2023-03-14

首先,让我们使用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()

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

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

您可以使用rotation\u mode参数使旋转发生在文本的左上角,在这种情况下会得到更好的结果。

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

如果这些选项不够细粒度,即您希望更准确地定位标签,例如,将标签移动到某些点的一侧,则可以使用变换。下面将使用matplotlib在水平方向上偏移标签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)

与@explorerDude提供的解决方案相比,这种方法的优点是偏移量独立于图形中的数据,因此它通常适用于任何绘图,并且对于给定的字体大小,其外观相同。

 类似资料:
  • 刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。 xticks() 和 ytic

  • 问题内容: 对于y轴上的每个刻度标签,我想更改: 我正在绘制对数日志数据(以2为底),但是我希望标签显示原始数据值。 我知道我可以得到当前的y标签 这给了我一个列表: 每个列表都是 我在http://matplotlib.org/users/text_props.html上查看了文本对象的文档, 但是我仍然不确定更改每个文本标签中的字符串的正确语法是什么。 更改标签后,可以使用以下方法在轴上设置它

  • 我的极坐标图是什么样子的 我试图移动ytick标签,使它们与轴标签类似地对齐。例如,'PTS'标签水平对齐到其轴,但ytick标签向右移动。 对于y值标签,我使用set_rgrids()函数指定角度和标签值,并使用tick_params()函数指定标签属性,如旋转。但是,此函数不允许我设置标签的文本框对齐。 如何将y值向左移动,使其直接位于相应的轴标签下? 完整代码:

  • 问题内容: 我遇到了与此处报告的问题类似的问题。我不明白为什么刻度标签文本为空字符串: 输出: 我得到的结果相同,但是绘制的图在保存或显示时在x轴上显示了八个带标记的刻度。但是,如果我 在 显示图 后 要求标签,则该列表已正确填充。当然,现在要做任何更改都为时已晚。 输出: 为什么会发生这种情况(Mac OS X Yosemite,Matplotlib 1.5.1),以及 在 显示或保存绘图 之前

  • 问题内容: 我要针对日期绘制具有五个数字(210.10、210.25、211.35等)的数字,我希望y轴刻度线显示所有数字(“ 214.20”而不是“ 0.20 + 2.14e2”),但没有能够弄清楚这一点。我试图将ticklabel格式设置为纯格式,但似乎没有效果。 关于我明显失踪的任何提示吗? 问题答案: 您也可以只关闭偏移量:(几乎完全相同的副本,如何删除matplotlib轴上的相对偏移)

  • 问题内容: 如何在线性与线性图上仅在y轴上旋转次刻度? 当我使用该功能打开次刻度时,它们同时出现在x和y轴上。 问题答案: 没关系,我知道了。