Python更新rcParams的意外行为

2024-09-24 22:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想增加绘图的总字体大小,然后将其重置为默认值。如果我通过plt.rcParams.update()增加fontsize,并通过plt.rcParams.update()减少fontsize,那么一切都很好。但是,如果我通过plt.rcParams = plt.rcParamsDefault.copy()重置参数,fontsize将不会减小到原始值。同样,在尝试了此重置之后,即使使用plt.rcParams.update(),我也无法再减小fontsize。我正在使用PyCharm,但这种行为甚至出现在普通的IPython控制台中

Python是否正在访问另一个“隐藏”参数集?我应该以不同的方式更改绘图参数吗

规范:Python 3.7.6、matplotlib 3.1.2、IPython 7.11.1

考虑这个极小的例子:

import numpy as np
import matplotlib.pyplot as plt

plt.ion()

np.random.seed(999)
data = np.random.random((10,10))

plt.figure()
plt.imshow(data)

plt.rcParams.update({'font.size': 30})

plt.figure()
plt.imshow(data)

bug = False
if bug:
    plt.rcParams = plt.rcParamsDefault.copy()
    plt.ion()
else:
    plt.rcParams.update({'font.size': 10})

plt.figure()
plt.imshow(data)

Tags: 绘图data参数ipythonnpupdatepltrandom
2条回答

根据rcParams documentation报告:

  1. 更改当前上下文参数的操作如下所示,而不是通过plt.rcParams.update()函数

plt.rcParams['font.size'] = 10

  1. 恢复matplotlib默认值(或matplotlibrc文件默认值)的操作如下所示

plt.rcdefaults() # from matplotlib defaults

plt.rc_file_defaults() # from file

你能试试这些更新和重置功能吗?我怀疑update函数可能正在重写当前或文件默认值。我还记得在IPython控制台中读到rcParams的行为不同,但我现在找不到引用

恢复默认参数的两个选项:

  • plt.rcdefaults()(如@ilke444's answer中所述)
  • 或者更新字典,比如plt.rcParams.update(plt.rcParamsDefault)

So why does plt.rcParams = plt.rcParamsDefault.copy() not work?

这是因为您只需将一些新字典分配给变量。它不会更新原始版本。要理解这一点,需要一个简单的案例

mydict = dict(a=5, b=5)

class Usage():
    def __init__(self, dic):
        self.dic = dic

    def do_something(self):
        print(self.dic)

usage = Usage(mydict)
usage.do_something()
# prints {'a': 5, 'b': 5}

mydict.update({"a" : 0})
usage.do_something()   
# prints {'a': 0, 'b': 5}

mydict = dict(a=2, b=2)
usage.do_something()   
# still prints {'a': 0, 'b': 5}, because only the variable
# mydict is changed, but how should `usage` know about that change?

相关问题 更多 >