关于设置 matplotlib.pyplot 文本元素的字体大小

use*_*882 5 python plot matplotlib

matplotlib.pyplot经常需要更改给定内 4 个不同文本元素的字体大小axes

  • 轴标签
  • 主要刻度标签
  • 图例文本
  • 轴标题

这就是我目前的做法:

import matplotlib.pyplot as plt
plt.plot([1,2,3], label = 'Whatever')
plt.xlabel('xaxis', fontsize = 16)
plt.ylabel('yaxis', fontsize = 20)
plt.legend(fontsize = 18)
plt.xticks(fontsize = 20)
plt.yticks(fontsize = 20)
plt.title('PLOT', fontsize = 20)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这是相当多的代码行,特别是考虑到通常我需要所有这些都具有相同的字体大小(尽管本示例中没有反映这一点)。此外,这些行可能分散在我的脚本中,如果我需要重置字体,则很难找到。我倾向于认为网格、字体、颜色和图例等格式元素与实际的数据处理/绘图是分开的。因此我有两个问题:

  • 有没有一种方法可以使用 pyplot 获取所有这些元素,然后一次性设置它们的字体大小?
  • 有没有办法在绘图后设置这些对象的字体大小(特别是 x 和 y 标签以及标题,尽管最好是全部)?

jot*_*asi 6

实际上有多种方法可以在 matplotlib 中设置字体大小。最方便的是font.size在 matplotlibrc/全局 matplotlib 中设置全局参数rcParams,这通常是设置布局的好方法,因为它对于所有绘图都是相同的。这将更改所有元素的字体大小(尽管仅限于更改后创建的元素)。如果没有明确给出,所有字体大小都相对于该字体大小设置。据我所知,只有标题会更大,而其余元素实际上将具有设置的字体大小。这将轻松方便地解决您的第一个问题。(对于您的两个问题,一个稍微不太方便的解决方案显示在这个答案的底部。)

默认:

import matplotlib as mpl
import matplotlib.pyplot as plt

plt.plot([1,2,3], label = 'Whatever')
plt.xlabel('xaxis')
plt.ylabel('yaxis')
plt.legend()
plt.xticks()
plt.yticks()
plt.title('PLOT')
plt.show()
Run Code Online (Sandbox Code Playgroud)

给出:

在此输入图像描述

更改字体大小可以得到:

import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.size"] = 18

plt.plot([1,2,3], label = 'Whatever')
plt.xlabel('xaxis')
plt.ylabel('yaxis')
plt.legend()
plt.xticks()
plt.yticks()
plt.title('PLOT')
plt.gcf().set_tight_layout(True) # To prevent the xlabel being cut off
plt.show()
Run Code Online (Sandbox Code Playgroud)

然后给出:

在此输入图像描述

但绘图后更改大小不起作用:

import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.size"] = 7

plt.plot([1,2,3], label = 'Whatever')
plt.xlabel('xaxis')
plt.ylabel('yaxis')
plt.legend()
plt.xticks()
plt.yticks()
plt.title('PLOT')

mpl.rcParams["font.size"] = 18

plt.show()
Run Code Online (Sandbox Code Playgroud)

给出:

在此输入图像描述

遗憾的是,绘图后更改字体大小不太方便。尽管如此,你还是可以做到的。这个答案展示了一种相当不错的方法:

import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.size"] = 7

plt.plot([1,2,3], label = 'Whatever')
plt.xlabel('xaxis')
plt.ylabel('yaxis')
plt.legend()
plt.xticks()
plt.yticks()
plt.title('PLOT')

ax = plt.gca()
ax.title.set_fontsize(20)
for item in ([ax.xaxis.label, ax.yaxis.label] +
              ax.get_xticklabels() + ax.get_yticklabels() + 
              ax.get_legend().get_texts()):
     item.set_fontsize(18)

plt.gcf().set_tight_layout(True)
plt.show()
Run Code Online (Sandbox Code Playgroud)

给出:

在此输入图像描述

如果您想将其放在一行中,您可以定义一个传递轴对象的函数,类似于以下内容:

def changeFontSize(ax, size):
    ax.title.set_fontsize(size)
    for item in ([ax.xaxis.label, ax.yaxis.label] +
                  ax.get_xticklabels() + ax.get_yticklabels() + 
                  ax.get_legend().get_texts()):
         item.set_fontsize(size)

changeFontSize(plt.gca())
Run Code Online (Sandbox Code Playgroud)