Change Matplotlib font without impacting global

允我心安 提交于 2019-12-11 10:27:25

问题


I have a function that creates a plot, displays it, and saves it:

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

I want to the plot to be un-impacted by any settings currently in place without making global changes that impact the settings they are using:

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

How can I ensure that the plot created by the function is not impacted by the user's settings and that plots created after the function are not impacted by the use of the function?


回答1:


Your question is somewhat unclear on the scope.

Is it the font properties (only) that you want to control / override regardless of the global settings or are do you want ignore ALL existing settings.

If you want to control font properties only you could use fontproperties parameter:

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

As you can see from the resulting graph customized plot did not change and was not affected by the global font setting.

If you are looking for a more complete control you might want to look at how to use style sheets



来源:https://stackoverflow.com/questions/33712461/change-matplotlib-font-without-impacting-global

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!