Matplotlib使刻度标签的字体变小


299

在matplotlib图中,如何使用ax1.set_xticklabels()较小的刻度标签来设置字体大小?

此外,如何将其从水平旋转到垂直?


感谢您提出这个问题,我正在尝试解决这个问题。我在这里并不坚决反对,但看起来选民认为最好的答案不是公认的答案。你怎么看?
亚伦·霍尔

我是否正确地阅读了至少有5种不同的方法来更改matplotlib中的字体大小?:D
famargar

Answers:


127

请注意,较新版本的MPL具有此任务的快捷方式。该问题的其他答案中显示了一个示例:https : //stackoverflow.com/a/11386056/42346

下面的代码仅用于说明目的,不一定进行优化。

import matplotlib.pyplot as plt
import numpy as np

def xticklabels_example():
    fig = plt.figure() 

    x = np.arange(20)
    y1 = np.cos(x)
    y2 = (x**2)
    y3 = (x**3)
    yn = (y1,y2,y3)
    COLORS = ('b','g','k')

    for i,y in enumerate(yn):
        ax = fig.add_subplot(len(yn),1,i+1)

        ax.plot(x, y, ls='solid', color=COLORS[i]) 

        if i != len(yn) - 1:
            # all but last 
            ax.set_xticklabels( () )
        else:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(14) 
                # specify integer or one of preset strings, e.g.
                #tick.label.set_fontsize('x-small') 
                tick.label.set_rotation('vertical')

    fig.suptitle('Matplotlib xticklabels Example')
    plt.show()

if __name__ == '__main__':
    xticklabels_example()

在此处输入图片说明


84
顺便说一句:您可以使用而不是遍历刻度标签对象plt.setp。(也可以看看ax.tick_params)例如,您可以这样做plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=14)。此外,轴对象具有一种ax.is_last_row()方法,在您的示例中,这种方法很方便。相反if i != len...,您可以这样做if not ax.is_last_row()。(为什么是一种方法,我不知道... Matplotlib显然讨厌属性!)
Joe Kington

@乔:这是我第一次听说is_last_row(),谢谢!我过去使用plt.setp过,不一定要确定它代表了一种更规范的自定义刻度标签方法。谢谢,您已经消除了疑问。更广泛地说:您的答案,尤其是matplotlib标签中的答案,经常让我感到敬畏。继续努力。
mechanical_meat

1
谢谢!!我感谢您的客气话,尤其是您的来信!在这种情况下,规范是相对的。 plt.setp是一种“ matlab-ism”,而显式循环可能更Python化。我自己是一名matlab转换者,setp感觉很自然,但对每个人来说都是很自然的。imo是其中之一,可读性很强
乔·肯顿

50
在新版本中,我发现您必须使用labelsize参数:例如ax.tick_params(axis='x', labelsize=8)
Vladtn

应该get_ticklabels不是get_major_ticks
jez

505

实际上有一个更简单的方法。我刚刚发现:

import matplotlib.pyplot as plt
# We prepare the plot  
fig, ax = plt.subplots()

# We change the fontsize of minor ticks label 
ax.tick_params(axis='both', which='major', labelsize=10)
ax.tick_params(axis='both', which='minor', labelsize=8)

但是,这只能回答label部分问题的大小。


2
使用axis = 'x'axis = 'y'修改其中一个轴
loved.by.Jesus

221

要同时指定字体大小和旋转度,请尝试以下操作:

plt.xticks(fontsize=14, rotation=90)

4
请注意,在使用类似MATLAB的pyplot接口时会使用它。在面向对象的接口的情况下,应使用轴对象的tick_params()方法或轴对象的set_tick_params()方法(请参见其他答案)。
wombatonfire

54

或者,您可以执行以下操作:

import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size 

36
plt.tick_params(axis='both', which='minor', labelsize=12)

如果您要更改字体大小而不设置新标签,这是唯一可行的答案。
大卫·斯坦斯比

@DavidStansby我不相信这是真的。我遇到了这个确切的问题(上面已提到),并且能够使用不同于该解决方案的替代方法。使用ax.xaxis.set_tick_params(labelsize=20)
Kyle Swanson

1
最简单的答案,不需要引用斧头对象
jeremy_rutman

26

另一种选择

我有两个并排的图,想分别调整刻度线标签。

上面的解决方案很接近,但是对我来说却没有用。我从此matplotlib 页面找到了解决方案。

ax.xaxis.set_tick_params(labelsize=20)

这可以解决问题,并且很直接。在我的用例中,需要调整的是右图。自从创建新的刻度标签以来,对于左侧的图,我可以在设置标签的相同过程中调整字体。

ax1.set_xticklabels(ax1_x, fontsize=15)
ax1.set_yticklabels(ax1_y, fontsize=15)

因此我使用了正确的情节,

ax2.xaxis.set_tick_params(labelsize=24)
ax2.yaxis.set_tick_params(labelsize=24)

轻微的微妙...我知道...但是我希望这可以帮助某人:)

如果有人知道如何调整数量级标签的字体大小,则加分。

在此处输入图片说明


22

在当前版本的Matplotlib中,您可以执行axis.set_xticklabels(labels, fontsize='small')


1
这也迫使您指定labels。最好只更改字体大小。
Guimoute

16

您还可以使用如下一行来更改标签显示参数(如fontsize):

zed = [tick.label.set_fontsize(14) for tick in ax.yaxis.get_major_ticks()]

1
我认为使用具有副作用的列表理解不是最佳实践。我建议改用标准的for循环。
jjmontes

14

对于较小的字体,我使用

ax1.set_xticklabels(xticklabels, fontsize=7)

而且有效!


您如何定义xticklabels?
mLstudent33

10

以下为我工作:

ax2.xaxis.set_tick_params(labelsize=7)
ax2.yaxis.set_tick_params(labelsize=7)

上面的优点是您无需提供的array,也不需要labels使用上的任何数据axes

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.