попробуй ... кроме работы с версиями matplotlib - PullRequest
1 голос
/ 18 января 2020

У меня есть машины с двумя разными версиями matplotlib (точнее, мои студенты). Более новый plt.hist принимает аргумент density, а более старый принимает аналогичный аргумент normed. Эти аргументы позволяют мне строить пропорции, а не считать. Я думал, что смогу запустить это с try... except..., но столкнулся с проблемой.

Мой код:

import matplotlib.pyplot as plt
import numpy as np

N=1000
sizes = [np.random.binomial(100, 0.03) for counter in range(N)]

fig = plt.figure(1)
main = plt.axes()

try:  
    main.hist(sizes, bins = range(21), density = True) 
except AttributeError:
    main.hist(sizes, bins = range(21), normed = True) 

main.axis(ymax=0.4)

enter image description here

И вот где я не установил ymax

enter image description here

Это работает с Matplotlib v2.0.0 (да, старый, я Я полагаю, что где-то есть зависимость, которая блокирует наши попытки обновления).

То, что здесь происходит, заключается в том, что первая попытка построения графика создает ошибку, но к тому времени она уже вычерчивает счетчики для цифры , Так что на самом деле происходит то, что я получаю подсчеты, рассчитанные с помощью бита try, а пропорции - с помощью бита except.

Как мне лучше обойти эту проблему, давая код для студентов что они не должны изменять?

1 Ответ

1 голос
/ 19 января 2020

О, да, ты прав. Проблема в том, что сигнатура функции hist допускает аргументы ключевых слов, и что они проверяются только после , художники уже созданы. Поэтому вызов

ax.hist(..., density=True)

в версии, которая не имеет аргумента density, все равно будет передавать его в качестве аргумента ключевого слова, подобно тому, как вы можете передать любое свойство Artist, например цвета, стили линий и т. д. c.

Единственным хорошим решением здесь является проверка версии , используемой напрямую, и в зависимости от этого используйте один из аргументов:

from distutils.version import LooseVersion
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

N=1000
sizes = [np.random.binomial(100, 0.03) for counter in range(N)]

fig = plt.figure(1)
main = plt.axes()

if LooseVersion(matplotlib.__version__) >=  LooseVersion("2.1"):  
    hist_kw = dict(density=True)
else:
    hist_kw = dict(normed=True)

main.hist(sizes, bins = range(21), **hist_kw) 
main.axis(ymax=0.4)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...