我想对图中选定的几个勾号标签做一些修改。

例如,如果我这样做:

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

更改了标记标签的字体大小和方向。

然而,如果尝试:

label.set_text('Foo')

没有修改勾号标签。如果我这样做:

print label.get_text()

什么都没有印出来。

这里还有一些奇怪的事情。当我试着这样做时:

import matplotlib.pyplot as plt
import numpy as np

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

只打印空字符串,但plot包含标记为'0.0'、'0.5'、'1.0'、'1.5'和'2.0'的刻度。


当前回答

注意:除非ticklabels已经设置为字符串(通常在箱线图中是这样),否则这将不适用于任何更新于1.1.0的matplotlib版本。如果你正在从当前的github master工作,这将不起作用。我还不确定是什么问题……这可能是一个无意的变化,也可能不是……

通常情况下,你会这样做:

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故意避免对刻度等进行“静态”定位,除非明确地告诉它这样做。假设您希望与图形交互,因此图形的边界、刻度、刻度标签等将动态变化。

因此,不能只设置给定标记标签的文本。默认情况下,每次绘制图形时,它都会被轴的Locator和Formatter重新设置。

但是,如果Locators和Formatters被设置为静态(分别为FixedLocator和FixedFormatter),则标记标签保持不变。

这就是set_*ticklabels或ax.*axis。set_ticklabels。

希望这能让您更清楚地了解为什么更改单个标记有点复杂。

通常,你真正想做的只是注释一个特定的位置。在这种情况下,请查看注释。

其他回答

axes类有一个set_yticklabels函数,它允许你设置tick标签,如下所示:

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

ax.set_xticklabels(group_labels)

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

在这里,我们打算修改Matplotlib中的一些tick标签,但没有副作用,这可以干净地工作,并保留偏移的科学符号。本解决方案中没有遇到其他一些答案中讨论的问题。

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

from matplotlib import rcParams
rcParams['axes.formatter.use_mathtext'] = True

class CustomScalarFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, useOffset=None, useMathText=None, useLocale=None, replace_values=([],[])):
        super().__init__(useOffset=None, useMathText=None, useLocale=None)
        self.replace_values = replace_values

    def __call__(self, x, pos=None):
        """
        Return the format for tick value *x* at position *pos*.
        """
        if len(self.locs) == 0:
            return ''
        elif x in self.replace_values[0]:
            idx = self.replace_values[0].index(x)
            return str(self.replace_values[1][idx])
        else:
            xp = (x - self.offset) / (10. ** self.orderOfMagnitude)
            if abs(xp) < 1e-8:
                xp = 0
            return self._format_maybe_minus_and_locale(self.format, xp)


z = np.linspace(0, 5000, 100)
fig, ax = plt.subplots()

xmajorformatter = CustomScalarFormatter(replace_values=([2000,0],['$x_0$','']))
ymajorformatter = CustomScalarFormatter(replace_values=([1E7,0],['$y_0$','']))
ax.xaxis.set_major_formatter(xmajorformatter)
ax.yaxis.set_major_formatter(ymajorformatter)

ax.plot(z,z**2)
plt.show()

我们在这里所做的是创建matplotlib.ticker. scalarformatter类的派生类,matplotlib默认使用它来格式化标签。代码从matplotlib源复制,但只有__call__函数被复制和修改。后

        elif x in self.replace_values[0]:
            idx = self.replace_values[0].index(x)
            return str(self.replace_values[1][idx])

是添加到__call__函数中执行替换工作的新行。派生类的优点是它继承了基类的所有特性,比如偏移量标记法、科学标记法,如果值很大的话就标记。结果是:

注意:除非ticklabels已经设置为字符串(通常在箱线图中是这样),否则这将不适用于任何更新于1.1.0的matplotlib版本。如果你正在从当前的github master工作,这将不起作用。我还不确定是什么问题……这可能是一个无意的变化,也可能不是……

通常情况下,你会这样做:

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故意避免对刻度等进行“静态”定位,除非明确地告诉它这样做。假设您希望与图形交互,因此图形的边界、刻度、刻度标签等将动态变化。

因此,不能只设置给定标记标签的文本。默认情况下,每次绘制图形时,它都会被轴的Locator和Formatter重新设置。

但是,如果Locators和Formatters被设置为静态(分别为FixedLocator和FixedFormatter),则标记标签保持不变。

这就是set_*ticklabels或ax.*axis。set_ticklabels。

希望这能让您更清楚地了解为什么更改单个标记有点复杂。

通常,你真正想做的只是注释一个特定的位置。在这种情况下,请查看注释。

试试这个:

  fig,axis = plt.subplots(nrows=1,ncols=1,figsize=(13,6),sharex=True)
  axis.set_xticklabels(['0', 'testing', '10000', '20000', '30000'],fontsize=22)

也可以使用pylab和xticks来实现这一点

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

https://matplotlib.org/stable/gallery/ticks_and_spines/ticklabels_rotation.html