Python обновить rcParams неожиданное поведение - PullRequest
0 голосов
/ 04 марта 2020

Я хочу увеличить общий размер шрифта для графика, а затем сбросить его до значения по умолчанию. Если я увеличу размер шрифта с помощью plt.rcParams.update() и уменьшу также с помощью plt.rcParams.update(), все будет хорошо. Однако, если я сброслю параметры с помощью plt.rcParams = plt.rcParamsDefault.copy(), размер шрифта не уменьшится до исходного значения. Также после попытки сброса, даже с plt.rcParams.update() я больше не могу уменьшить размер шрифта. Я использую PyCharm, но такое поведение проявляется даже в простой консоли I Python.

Имеет ли Python доступ к другому, "скрытому", набору параметров? Стоит ли менять параметры графика по-другому?

Технические характеристики: Python 3.7.6, matplotlib 3.1.2, I Python 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)

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Два варианта восстановления параметров по умолчанию:

  • plt.rcdefaults() (как упомянуто в ответе @ ilke444 )
  • или обновление словаря, например plt.rcParams.update(plt.rcParamsDefault)

Так почему plt.rcParams = plt.rcParamsDefault.copy() не работает?

Это потому, что вы просто присваиваете некоторый новый словарь переменной. Это не будет обновлять оригинал. Чтобы понять этот condsider простой случай

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?
1 голос
/ 04 марта 2020

В соответствии с документацией rcParams :

  1. Изменение текущих параметров контекста производится, как показано ниже, а не через функцию plt.rcParams.update().

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

Восстановление значений по умолчанию для matplotlib (или значений по умолчанию для файла matplotlibrc) выполняется, как показано ниже.

plt.rcdefaults() # from matplotlib defaults

plt.rc_file_defaults() # from file

Можете ли вы попробовать с этими функциями обновления и сброса? Я подозреваю, что функция обновления может переписывать текущие или файловые значения по умолчанию. Я также помню, что rcParams вел себя по-разному в консоли I Python, но сейчас не могу найти ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...