如何在matplotlib绘图上更改字体大小

如何更改matplotlib图上所有元素(刻度、标签、标题)的字体大小?

我知道如何更改刻度标签大小,这是通过以下方式完成的:

import matplotlibmatplotlib.rc('xtick', labelsize=20)matplotlib.rc('ytick', labelsize=20)

但是如何改变其余的呢?

1733430 次浏览

Matplotlib留档

font = {'family' : 'normal','weight' : 'bold','size'   : 22}
matplotlib.rc('font', **font)

这会将所有项目的字体设置为kwargs对象font指定的字体。

或者,您也可以按照这个答案中的建议使用rcParamsupdate方法:

matplotlib.rcParams.update({'font.size': 22})

import matplotlib.pyplot as pltplt.rcParams.update({'font.size': 22})

您可以在自定义matplotlib页面上找到可用属性的完整列表。

matplotlib.rcParams.update({'font.size': 22})

如果您只想更改已创建的特定绘图的字体大小,请尝试以下操作:

import matplotlib.pyplot as plt
ax = plt.subplot(111, xlabel='x', ylabel='y', title='title')for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +ax.get_xticklabels() + ax.get_yticklabels()):item.set_fontsize(20)

更新时间:查看答案的底部,以获得更好的方法。
更新#2:我也想出了改变传奇标题字体。
更新#3:有一个bug在Matplotlib 2.0.0导致对数轴的刻度标签恢复为默认字体。应该在2.0.1中修复,但我已经在答案的第二部分包含了解决方法。

这个答案适用于任何试图更改所有字体的人,包括图例,以及任何试图为每件事使用不同字体和大小的人。它不使用rc(这似乎对我不起作用)。这是相当麻烦的,但我个人无法掌握任何其他方法。它基本上结合了ryggyr在这里的答案和SO上的其他答案。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.font_manager as font_manager
# Set the font dictionaries (for plot title and axis titles)title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal','verticalalignment':'bottom'} # Bottom vertical alignment for more spaceaxis_font = {'fontname':'Arial', 'size':'14'}
# Set the font properties (for use in legend)font_path = 'C:\Windows\Fonts\Arial.ttf'font_prop = font_manager.FontProperties(fname=font_path, size=14)
ax = plt.subplot() # Defines ax variable by creating an empty plot
# Set the tick labels fontfor label in (ax.get_xticklabels() + ax.get_yticklabels()):label.set_fontname('Arial')label.set_fontsize(13)
x = np.linspace(0, 10)y = x + np.random.normal(x) # Just simulates some data
plt.plot(x, y, 'b+', label='Data points')plt.xlabel("x axis", **axis_font)plt.ylabel("y axis", **axis_font)plt.title("Misc graph", **title_font)plt.legend(loc='lower right', prop=font_prop, numpoints=1)plt.text(0, 0, "Misc text", **title_font)plt.show()

这种方法的好处是,通过拥有多个字体字典,您可以为各种标题选择不同的字体/大小/权重/颜色,为刻度标签选择字体,为图例选择字体,所有这些都是独立的。


更新:

我已经找到了一个稍微不同的、不那么混乱的方法,它取消了字体字典,并允许您的系统上的任何字体,甚至是. otf字体。要为每件事都有单独的字体,只需编写更多font_pathfont_prop之类的变量。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.font_manager as font_managerimport matplotlib.ticker# Workaround for Matplotlib 2.0.0 log axes bug https://github.com/matplotlib/matplotlib/issues/8017 :matplotlib.ticker._mathdefault = lambda x: '\\mathdefault{%s}'%x
# Set the font properties (can use more variables for more fonts)font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'font_prop = font_manager.FontProperties(fname=font_path, size=14)
ax = plt.subplot() # Defines ax variable by creating an empty plot
# Define the data to be plottedx = np.linspace(0, 10)y = x + np.random.normal(x)plt.plot(x, y, 'b+', label='Data points')
for label in (ax.get_xticklabels() + ax.get_yticklabels()):label.set_fontproperties(font_prop)label.set_fontsize(13) # Size here overrides font_prop
plt.title("Exponentially decaying oscillations", fontproperties=font_prop,size=16, verticalalignment='bottom') # Size here overrides font_propplt.xlabel("Time", fontproperties=font_prop)plt.ylabel("Amplitude", fontproperties=font_prop)plt.text(0, 0, "Misc text", fontproperties=font_prop)
lgd = plt.legend(loc='lower right', prop=font_prop) # NB different 'prop' argument for legendlgd.set_title("Legend", prop=font_prop)
plt.show()

希望这是一个全面的回答

基于上述内容:

import matplotlib.pyplot as pltimport matplotlib.font_manager as fm
fontPath = "/usr/share/fonts/abc.ttf"font = fm.FontProperties(fname=fontPath, size=10)font2 = fm.FontProperties(fname=fontPath, size=24)
fig = plt.figure(figsize=(32, 24))fig.text(0.5, 0.93, "This is my Title", horizontalalignment='center', fontproperties=font2)
plot = fig.add_subplot(1, 1, 1)
plot.xaxis.get_label().set_fontproperties(font)plot.yaxis.get_label().set_fontproperties(font)plot.legend(loc='upper right', prop=font)
for label in (plot.get_xticklabels() + plot.get_yticklabels()):label.set_fontproperties(font)

这是一个完全不同的方法,它可以很好地改变字体大小:

改变图形尺寸

我通常使用这样的代码:

import matplotlib.pyplot as pltimport numpy as npfig = plt.figure(figsize=(4,3))ax = fig.add_subplot(111)x = np.linspace(0,6.28,21)ax.plot(x, np.sin(x), '-^', label="1 Hz")ax.set_title("Oscillator Output")ax.set_xlabel("Time (s)")ax.set_ylabel("Output (V)")ax.grid(True)ax.legend(loc=1)fig.savefig('Basic.png', dpi=300)

您制作图形大小的较小,字体的更大相对于情节。这也提升了标记。注意我还设置了dpi或每英寸点数。我从AMTA(美国建模教师)论坛的帖子中学到了这一点。上面代码的示例:输入图片描述

如果你是像我一样的控制狂,你可能需要显式设置所有字体大小:

import matplotlib.pyplot as plt
SMALL_SIZE = 8MEDIUM_SIZE = 10BIGGER_SIZE = 12
plt.rc('font', size=SMALL_SIZE)          # controls default text sizesplt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes titleplt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labelsplt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labelsplt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labelsplt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsizeplt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title

请注意,您还可以设置在matplotlib上调用rc方法的大小:

import matplotlib
SMALL_SIZE = 8matplotlib.rc('font', size=SMALL_SIZE)matplotlib.rc('axes', titlesize=SMALL_SIZE)
# and so on ...

我完全同意Huster教授的观点,即最简单的方法是更改图形的大小,这样可以保留默认字体。在将图形保存为pdf时,我不得不使用bbox_inches选项来补充这一点,因为轴标签被剪切了。

import matplotlib.pyplot as pltplt.figure(figsize=(4,3))plt.savefig('Basic.pdf', bbox_inches='tight')

这是Marius Retegan回答的扩展。您可以使用所有修改创建一个单独的JSON文件,然后加载rcParams.update.这些更改仅适用于当前脚本。所以

import jsonfrom matplotlib import pyplot as plt, rcParams
s = json.load(open("example_file.json")rcParams.update(s)

并将此example_file.json保存在同一文件夹中。

{"lines.linewidth": 2.0,"axes.edgecolor": "#bcbcbc","patch.linewidth": 0.5,"legend.fancybox": true,"axes.color_cycle": ["#348ABD","#A60628","#7A68A6","#467821","#CF4457","#188487","#E24A33"],"axes.facecolor": "#eeeeee","axes.labelsize": "large","axes.grid": true,"patch.edgecolor": "#eeeeee","axes.titlesize": "x-large","svg.fonttype": "path","examples.directory": ""}

使用plt.tick_params(labelsize=14)

您可以使用plt.rcParams["font.size"]matplotlib中设置font_size,也可以使用plt.rcParams["font.family"]matplotlib中设置font_family。试试这个例子:

import matplotlib.pyplot as pltplt.style.use('seaborn-whitegrid')
label = [1,2,3,4,5,6,7,8]x = [0.001906,0.000571308,0.0020305,0.0037422,0.0047095,0.000846667,0.000819,0.000907]y = [0.2943301,0.047778308,0.048003167,0.1770876,0.532489833,0.024611333,0.157498667,0.0272095]

plt.ylabel('eigen centrality')plt.xlabel('betweenness centrality')plt.text(0.001906, 0.2943301, '1 ', ha='right', va='center')plt.text(0.000571308, 0.047778308, '2 ', ha='right', va='center')plt.text(0.0020305, 0.048003167, '3 ', ha='right', va='center')plt.text(0.0037422, 0.1770876, '4 ', ha='right', va='center')plt.text(0.0047095, 0.532489833, '5 ', ha='right', va='center')plt.text(0.000846667, 0.024611333, '6 ', ha='right', va='center')plt.text(0.000819, 0.157498667, '7 ', ha='right', va='center')plt.text(0.000907, 0.0272095, '8 ', ha='right', va='center')plt.rcParams["font.family"] = "Times New Roman"plt.rcParams["font.size"] = "50"plt.plot(x, y, 'o', color='blue')

请查看输出:

以下是我在Jupyter Notebook中通常使用的内容:

# Jupyter Notebook settings
from IPython.core.display import display, HTMLdisplay(HTML("<style>.container { width:95% !important; }</style>"))%autosave 0%matplotlib inline%load_ext autoreload%autoreload 2
from IPython.core.interactiveshell import InteractiveShellInteractiveShell.ast_node_interactivity = "all"

# Imports for data analysisimport pandas as pdimport matplotlib.pyplot as pltpd.set_option('display.max_rows', 2500)pd.set_option('display.max_columns', 500)pd.set_option('display.max_colwidth', 2000)pd.set_option('display.width', 2000)pd.set_option('display.float_format', lambda x: '%.3f' % x)
#size=25size=15params = {'legend.fontsize': 'large','figure.figsize': (20,8),'axes.labelsize': size,'axes.titlesize': size,'xtick.labelsize': size*0.75,'ytick.labelsize': size*0.75,'axes.titlepad': 25}plt.rcParams.update(params)

rcParams的更改是非常精细的,大多数时候你想要的只是缩放所有的字体大小,这样它们就可以在你的图形中更好地看到。图形大小是一个很好的技巧,但你必须在所有的图形中携带它。另一种方法(不是纯粹的matplotlib,或者如果你不使用seborn,可能会矫枉过正)是使用seborn设置字体比例:

sns.set_context('paper', font_scale=1.4)

免责声明:我知道,如果你只使用matplotlib,那么你可能不想安装一个完整的模块来缩放你的绘图(我的意思是为什么不),或者如果你使用seborn,那么你对选项有更多的控制权。但是有一种情况,你在数据科学虚拟环境中有seborn,但在这个笔记本中没有使用它。无论如何,另一个解决方案。

我只是想指出赫尔曼·沙夫的佩德罗·M·杜阿尔特的答案都有效,但你必须在实例化subplots()之前这样做,这些设置不会影响已经实例化的对象。我知道这不是一个动脑筋的问题,但我花了相当多的时间弄清楚为什么当我在调用subplots()后尝试使用这些更改时,这些答案对我不起作用。

例如:

import matplotlib.pyplot as pltplt.rcParams.update({'font.size': 6,})fig, ax = plt.subplots()#create your plotplt.show()

SMALL_SIZE = 8MEDIUM_SIZE = 10BIGGER_SIZE = 12
plt.rc('font', size=SMALL_SIZE)          # controls default text sizesplt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labelsplt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labelsfig, ax = plt.subplots()#create your plotplt.show()

它在评论中提到,但值得自己的答案:

结合修改两者figsize=dpi=,可以调整图形大小和所有文本标签的比例:

fig, ax = plt.subplots(1, 1, figsize=(8, 4), dpi=100)

(或更短:)

fig, ax = plt.subplots(figsize=(8, 4), dpi=100)

这有点棘手:

  1. figsize实际上控制文本相对的比例到绘图范围(以及绘图的长宽比)。

  2. dpi调整笔记本中图形的大小(保持文本的相对比例和情节的长宽比不变)。

我写了一个修改版本的答案@ryggyr允许更多的控制单个参数和工作在多个子图:

def set_fontsizes(axes,size,title=np.nan,xlabel=np.nan,ylabel=np.nan,xticks=np.nan,yticks=np.nan):if type(axes) != 'numpy.ndarray':axes=np.array([axes])    
options = [title,xlabel,ylabel,xticks,yticks]for i in range(len(options)):if np.isnan(options[i]):options[i]=size        
title,xlabel,ylabel,xticks,yticks=options    
for ax in axes.flatten():ax.title.set_fontsize(title)ax.xaxis.label.set_size(xlabel)ax.yaxis.label.set_size(ylabel)ax.tick_params(axis='x', labelsize=xticks)ax.tick_params(axis='y', labelsize=yticks)