在为matplotlib.pyplot文本元素

时间:2017-07-25 05:46:54

标签: python matplotlib plot

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

  • 轴标签
  • 主要刻度标签
  • 图例文字
  • axes title

这就是我目前的做法:

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)

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

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

1 个答案:

答案 0 :(得分:2)

实际上有多种方法可以在matplotlib中设置字体大小。最方便的是在全局matplotlib font.size中的matplotlibrc /中设置全局rcParams参数,通常为a nice way to set your layout because it will then be the same for all plots。这将改变所有元素'字体大小(尽管只是在更改后创建的字体大小)。如果未明确指定,则相对于此字体大小设置所有字体大小。据我所知,只有标题会更大,而其余的元素实际上将具有设置的字体大小。这将轻松方便地解决您的第一个问题。 (这个答案的底部显示了一个稍微不太方便解决问题的方法。)

默认值:

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

给出:

enter image description here

更改字体大小给出:

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

然后给出:

enter image description here

绘图后更改尺寸不起作用:

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

给出:

enter image description here

在绘制悲伤后更改字体大小不太方便。你可以做到这一点。这个answer显示了一种相当不错的方式:

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

给出:

enter image description here

如果你想让它在一行中,你可以定义一个传递轴对象的函数,类似于:

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