修改刻度标签文本


215

我想对图中的几个选定的刻度标签进行一些修改。

例如,如果我这样做:

label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')

字体大小和刻度标签的方向已更改。

但是,如果尝试:

label.set_text('Foo')

蜱标签修改。另外,如果我这样做:

print label.get_text()

什么都不会打印。

这里有些奇怪。当我尝试这个:

 from pylab import *
 axes = figure().add_subplot(111)
 t = arange(0.0, 2.0, 0.01)
 s = sin(2*pi*t)
 axes.plot(t, s)
 for ticklabel in axes.get_xticklabels():
     print ticklabel.get_text()

仅打印空字符串,但图中包含标记为“ 0.0”,“ 0.5”,“ 1.0”,“ 1.5”和“ 2.0”的刻度。


您可以提供用于获取标签的图吗?
Claudio 2012年

由于尚未绘制画布,因此获得空白标签。如果您draw()在尝试打印标签之前致电,您将得到期望的结果。不幸的是,设置单个刻度标签会更加困难(发生的事情是刻度定位器和格式化程序尚未重置,并且在您时会覆盖所有内容set_text)。如果有人没有击败我,我会再举一个例子。不过,现在我得坐公共汽车。
Joe Kington 2012年

@JoeKington:太好了!期待看到您的修复。
repoman 2012年

@repoman-好吧,看来我讲得太早了。我的想法适用于较旧版本的matplotlib,但不适用于最新版本。我需要做更多的挖掘。话虽这么说,这应该不那么复杂……
Joe Kington 2012年

Answers:


297

警告:除非ticklabel已设置为字符串(例如在boxplot中通常是这种情况),否则这不适用于任何比Matplotlib更新的版本1.1.0。如果您正在使用当前的github主机,则将无法使用。我不确定问题是什么...可能是意外更改,也可能不是。

通常,您会按照以下步骤进行操作:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# We need to draw the canvas, otherwise the labels won't be positioned and 
# won't have values yet.
fig.canvas.draw()

labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'

ax.set_xticklabels(labels)

plt.show()

在此处输入图片说明

要了解为什么需要跳过这么多的障碍,您需要更多地了解matplotlib的结构。

Matplotlib故意避免对刻度等进行“静态”定位,除非明确告知。假设您要与图进行交互,因此图的边界,刻度线,刻度标签等将动态变化。

因此,您不能只设置给定刻度标签的文本。默认情况下,每次绘制图形时,都会通过轴的“定位器”和“格式化程序”将其重置。

但是,如果将“定位器”和“格式器”设置为静态(分别为FixedLocatorFixedFormatter),则刻度线标签保持不变。

这是什么set_*ticklabelsax.*axis.set_ticklabels做。

希望这可以使我们更清楚地知道为什么更改单个刻度标签有些麻烦。

通常,您实际要做的只是注释特定位置。在这种情况下,请查看annotate


10
这似乎不适用于当前版本(1.20)!
Andrew Jaffe

1
如果刻度标签已经设置为字符串(例如在箱线图中),则该标签仍然有效。这可能很明显,但是由于答案的第一行是它不能在较新的matplotlib版本上运行,因此用户可能会完全跳过它(我最初做过)。也许简短地提一下。
joelostblom 2014年

2
我认为您可以将其压缩为plt.gca()。set_xticklabels(labels)
alexey

如果我想让“测试”的字体粗细成为bold别人使用“光”的字体粗细怎么办?有办法吗?
史蒂芬·史蒂文

1
对于在jupyter笔记本电脑中使用此功能的用户可能会受益于这fig.canvas.draw()一点的
重要性

95

pylabxticks也可以做到这一点

import matplotlib
import matplotlib.pyplot as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()

http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html


这是一个简单的解决方案,可用于pyplot 1.5.1。这应该被赞成。
wordsmith

尽管这个问题并没有要求,但我很欣赏这个示例可以让您在修改刻度线的同时设置刻度线的位置。
eclark '17

来自现代的matplotlib docs:“ pylab已过时,并且由于名称空间污染而强烈建议不要使用它。请改用pyplot。”
纳撒尼尔·琼斯

93

在较新版本的中matplotlib,如果未为刻度标签设置一堆str值,则''默认情况下它们是刻度值(绘制绘图时,标签只是刻度值)。知道这一点,要获得所需的输出,将需要执行以下操作:

>>> from pylab import *
>>> axes = figure().add_subplot(111)
>>> a=axes.get_xticks().tolist()
>>> a[1]='change'
>>> axes.set_xticklabels(a)
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>, 
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>, 
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>]
>>> plt.show()

结果: 在此处输入图片说明

现在,如果您进行检查_xticklabels,它们不再是一堆''

>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']

它适用于从1.1.1rc1到当前版本的版本2.0


谢谢,这是我一直在寻找的答案。最清洁的解决方案IMO;只需提供set_xticklabels混合的字符串和刻度对象列表。
卢克·戴维斯

请注意,如果将刻度标签设置为整数,这会将其更改为浮点型。容易解决,但值得注意。
接近

这个有效(ax.get_xticks().tolist())。投票最多的解决方案不是(ax.get_xtickslabels())。plt.show()尽管我fig.canvas.draw()按照建议使用,但在某种原因之前,它还是无法提取标签。
CypherX

仅供参考,来自现代matplotlib文档:“不赞成使用pylab,并且强烈建议不要使用pylab,因为名称空间受到污染。请改用pyplot。”
纳撒尼尔·琼斯

17

自问这个问题已经有一段时间了。截至今天(matplotlib 2.2.2),经过一些阅读和试验,我认为最好/正确的方法如下:

Matplotlib有一个名为模块,ticker“中包含用于支持完全可配置的蜱定位和格式化”。要修改绘图中的特定刻度,以下对我有用:

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np 

def update_ticks(x, pos):
    if x == 0:
        return 'Mean'
    elif pos == 6:
        return 'pos is 6'
    else:
        return x

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
ax.hist(data, bins=25, edgecolor='black')
ax.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
plt.show()

具有正态分布随机值的直方图

警告! x是刻度的值,并且pos是刻度在轴上的相对位置。请注意,建立索引时,其pos值以开头1,而不是0通常的值。


就我而言,我试图y-axis用百分比值格式化直方图的格式。mticker有另一个名为的类PercentFormatter,可以轻松地做到这一点,而无需像以前一样定义单独的函数:

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np 

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
weights = np.ones_like(data) / len(data)
ax.hist(data, bins=25, weights=weights, edgecolor='black')
ax.yaxis.set_major_formatter(mticker.PercentFormatter(xmax=1.0, decimals=1))
plt.show()

具有正态分布随机值的直方图

在这种情况下 xmax,数据值对应于100%。百分比计算为x / xmax * 100,这就是我们固定的原因xmax=1.0。同样,decimals是要在该点之后放置的小数位数。


12

axes类具有set_yticklabels函数,可用于设置刻度标签,如下所示:

#ax is the axes instance
group_labels = ['control', 'cold treatment',
             'hot treatment', 'another treatment',
             'the last one']

ax.set_xticklabels(group_labels)

我仍在努力,为什么上面的示例不起作用。


3
但是我只想更改一个标签。上面的技巧要求您提取所有刻度标签并将所需的标签设置为新值。但是,当label.get_text()不返回任何内容时,如何提取刻度标签?
repoman 2012年

11

这有效:

import matplotlib.pyplot as plt

fig, ax1 = plt.subplots(1,1)

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

ax1.set_xticks(x1)
ax1.set_xticklabels(squad, minor=False, rotation=45)

饲料


7

这也适用于matplotlib 3:

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

plt.xticks(x1, squad, rotation=45)

5

如果您不使用figax并且想要修改所有标签(例如,用于规范化),则可以执行以下操作:

labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))


-4

你可以做:

for k in ax.get_xmajorticklabels():
    if some-condition:
        k.set_color(any_colour_you_like)

draw()

有人可以解释为什么这个答案如此之低吗?
HlynurDavíðHlynsson '19

@HlynurDavíðHlynsson我认为这与问题无关。好吧,也许进行一些编辑...如果您将其与问题联系起来,请对其进行编辑。;)
loved.by.Jesus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.