【问题标题】:Matplotlib make tick labels font size smallerMatplotlib 使刻度标签字体变小
【发布时间】:2011-09-17 10:30:12
【问题描述】:

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

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

【问题讨论】:

  • 感谢您提出这个问题,我正在努力解决这个问题。我在这里没有强烈的意见,但看起来选民认为最好的答案不是被接受的答案。你怎么看?
  • 我是否正确阅读到至少有 5 种不同的方法可以更改 matplotlib 中的字体大小? :D

标签: python matplotlib


【解决方案1】:

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

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 部分的大小。

【讨论】:

  • 使用axis = 'x'axis = 'y' 只修改一个轴
【解决方案2】:

要同时指定字体大小和旋转,试试这个:

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

【讨论】:

  • 请注意,这是在使用类似 MATLAB 的 pyplot 接口时使用的。如果是面向对象的接口,则应使用轴对象的 tick_params() 方法或轴对象的 set_tick_params() 方法(请参阅其他答案)。
【解决方案3】:

请注意,较新版本的 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()

【讨论】:

  • 顺便说一句:您可以使用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:这是我第一次听说is_last_row(),谢谢!我过去使用过plt.setp,但不一定确定它代表了一种更规范的自定义刻度标签的方式。你已经消除了这个疑问,谢谢。更广泛地说:你的回答,尤其是在matplotlib 标签中,经常让我敬畏。继续努力。
  • 谢谢!!我很感激你的客气话,尤其是你的!在这种情况下,Canonical 是非常相对的。 plt.setp 是一个“matlab 主义”,一个显式循环可能更像是 pythonic。作为一个 matlab 转换者,我自己,setp 感觉很自然,但对每个人来说都是他们自己的。任何一个都非常可读,i.m.o.
  • 在新版本中我发现你必须使用 labelsize 参数:例如ax.tick_params(axis='x', labelsize=8)
  • 应该是get_ticklabels 而不是get_major_ticks
【解决方案4】:

或者,您可以这样做:

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

【讨论】:

    【解决方案5】:

    另一种选择

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

    上述解决方案很接近,但它们不适合我。我从这个 matplotlib page 找到了我的解决方案。

    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)
    

    一个小细节......我知道......但我希望这对某人有帮助:)

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

    【讨论】:

    • 试试这个:ax.yaxis.offsetText.set_fontsize(18)
    【解决方案6】:
    plt.tick_params(axis='both', which='minor', labelsize=12)
    

    【讨论】:

    • 如果您想在不设置新标签的情况下更改字体大小,这是唯一可行的答案。
    • @DavidStansby 我不相信这是真的。我遇到了这个确切的问题(上面提到过)并且能够使用与此解决方案不同的替代方法。使用ax.xaxis.set_tick_params(labelsize=20)
    • 最简单的答案,不需要参考 ax 对象
    • 我认为你想要 ax 对象..但每个人都有自己的
    【解决方案7】:

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

    【讨论】:

    • 这也迫使您指定labels。如果我们可以只改变字体大小就更好了。
    【解决方案8】:

    对于较小的字体,我使用

    ax1.set_xticklabels(xticklabels, fontsize=7)

    它有效!

    【讨论】:

    • 如何定义 xticklabels?
    • @mLstudent33 这只是一个标签列表......真的可以是任何东西
    【解决方案9】:

    你也可以用这样的一行来改变字体大小等标签显示参数:

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

    【讨论】:

    • 我认为使用具有副作用的列表推导并不是最佳做法。我建议改用标准 for 循环。
    【解决方案10】:

    以下内容对我有用:

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

    上述的好处是您不需要提供arraylabels 并且可以处理axes 上的任何数据。

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2014-03-22
      相关资源
      最近更新 更多