修改刻度标签文本

rep*_*man 182 python matplotlib

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

例如,如果我这样做:

label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')
Run Code Online (Sandbox Code Playgroud)

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

但是,如果尝试:

label.set_text('Foo')
Run Code Online (Sandbox Code Playgroud)

刻度标签未被修改.如果我这样做:

print label.get_text()
Run Code Online (Sandbox Code Playgroud)

没有打印.

这里有些陌生.当我尝试这个时:

 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()
Run Code Online (Sandbox Code Playgroud)

仅打印空字符串,但该图包含标记为"0.0","0.5","1.0","1.5"和"2.0"的刻度线.

Joe*_*ton 258

警告:除非ticklabels已经设置为字符串(通常是例如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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

要理解为什么需要跳过这么多箍,你需要更多地了解matplotlib的结构.

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

因此,您不能只设置给定刻度标签的文本.默认情况下,每次绘制绘图时,都会由轴的定位器和格式化程序重新设置.

但是,如果将Locators和Formatters设置为静态(FixedLocatorFixedFormatter分别),则tick标签保持不变.

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

希望这更清楚地说明为什么更改单个刻度标签有点令人费解.

通常,您实际想要做的只是注释某个位置.在那种情况下,请研究一下annotate.

  • 这似乎不适用于当前版本(1.20)! (7认同)
  • 我认为你可以将它浓缩为*plt.gca().set_xticklabels(labels)* (2认同)
  • 对于那些在 jupyter 笔记本中使用它的人来说,注意到“fig.canvas.draw()”至关重要,可能会受益匪浅 (2认同)

CT *_*Zhu 85

在较新版本中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()
Run Code Online (Sandbox Code Playgroud)

结果: 在此输入图像描述

现在如果你检查一下_xticklabels,它们就不再是一堆了''.

>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']
Run Code Online (Sandbox Code Playgroud)

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

  • 用户警告:FixedFormatter 只能与 FixLocator 一起使用 (2认同)

raf*_*lle 76

也可以使用pylabxticks来做到这一点

import pylab 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()
Run Code Online (Sandbox Code Playgroud)

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


sta*_*nri 11

axis类有一个set_yticklabels函数,允许你设置刻度标签,如下所示:

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

ax.set_xticklabels(group_labels)
Run Code Online (Sandbox Code Playgroud)

我还在研究为什么你上面的例子不起作用.

  • 但我只想改变一个标签.上述技巧要求您提取所有刻度标签并将所需的标签设置为新值.但是当label.get_text()什么都不返回时,如何提取刻度标签呢? (3认同)

iip*_*ipr 9

自问这个问题已经有一段时间了。截至今天(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()
Run Code Online (Sandbox Code Playgroud)

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

警告! 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()
Run Code Online (Sandbox Code Playgroud)

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

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


Mic*_*lSB 7

这也适用于 matplotlib 3:

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

plt.xticks(x1, squad, rotation=45)
Run Code Online (Sandbox Code Playgroud)


小智 6

这有效:

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)
Run Code Online (Sandbox Code Playgroud)

远百


dop*_*xxx 5

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

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

Run Code Online (Sandbox Code Playgroud)