在不影响全局的情况下更改 Matplotlib 字体

Change Matplotlib font without impacting global

我有一个函数可以创建、显示并保存绘图:

def make_a_plot():
    plt.plot(x,y)
    plt.show()
    plt.safefig('./my_plot.png')

我希望情节不受当前任何设置的影响,而不进行影响他们正在使用的设置的全局更改:

# User can set whatever plotting settings they want
plt.style.use('ggplot') 

def make_a_plot():

    #clear settings and modify font family
    rcdefaults()
    rcParams['font.family'] = 'sans-serif'

    plt.plot(x,y)
    plt.show()
    plt.safefig('./my_plot.png')

# Use the function
make_a_plot(x,y)

# Create a second plot with their ORIGINAL settings
plt.plot(x2,y2)
plt.show()

如何确保函数创建的图不受用户设置的影响,并且函数之后创建的图不受函数使用的影响?

你的问题在范围上有些不清楚。

无论全局设置如何,您想要控制/覆盖的字体属性(仅)还是您想要忽略所有现有设置。

如果你只想控制字体属性,你可以使用fontproperties参数:

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# Plt with customized font settings
def make_plot(ax, x, y):
    # Set the font dictionaries (for plot title and axis titles)
    title_font = {'fontname':'Arial', 'size':'16', 'color':'blue', 'weight':'normal'}   # This can be a long dictionary

    # Set the font properties for other places
    font_path = 'C:\Windows\Fonts\comic.ttf'
    font = fm.FontProperties(fname=font_path, size=14)
    axis_font = fm.FontProperties(fname=font_path, size=13)

    # Set the tick labels font
    for label in (ax.get_xticklabels() + ax.get_yticklabels()):
        # label.set_fontname('Arial')
        # label.set_fontsize(13)
        label.set_font_properties(font)

    ax.plot(x, y, 'r-', label=u'Thin Red Line')
    ax.set_xlabel(u"X axis", fontproperties=axis_font)
    ax.set_ylabel(u"Y axis", fontproperties=axis_font)
    ax.set_title(u"This is the Title", **title_font)
    ax.legend(loc='lower right', prop=font, numpoints=1)
    ax.text(0.1, 5, u"Some text", fontproperties=font)

# A regular plot with global fong settings:
def regular_plot(ax, x, y):
    ax.plot(x,y, 'b-', label=u'Blue Line')
    ax.set_xlabel(u"X axis")
    ax.set_ylabel(u"Y axis")
    ax.set_title(u"This is the Title", axes=ax1)
    ax.legend(loc='lower right', numpoints=1)

fig, (ax1, ax2, ax3) = plt.subplots(1,3, figsize=(9,3))
x = y = range(0, 10) # Some data

# 1st make a regular plot:
regular_plot(ax1, x, y)
# then make customized plot:
make_plot(ax2, x, y)
# then agains a regular plot:
regular_plot(ax3, x, y)
plt.show()

正如您从生成的图形中看到的那样,自定义绘图没有变化,也不受全局字体设置的影响。

如果您正在寻找更完整的控件,您可能想看看如何使用 style sheets