Использование setp, чтобы скрыть оси осей - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь использовать setp в matplotlib, чтобы установить видимость позвоночника на False, но я получаю ошибку "AttributeError: 'str' object has no attribute 'update'". Насколько я понимаю, с помощью setp мы можем изменить свойства итерируемых объектов, и хотим выполнить его с помощью spines.

. Каков правильный синтаксис для эффективного использования setp?

Hier a MWE:

import matplotlib.pyplot as plt

x = range(0,10)
y = [i*i for i in x]

plt.plot(x,y) #Plotting x against y
axes = plt.gca() #Getting the current axis

axes.spines['top'].set_visible(False) #It works

plt.setp(axes.spines, visible=False) #It rises error

plt.show() #Showing the plot

Версии: python3 .8.2, Matplotlib 3.2.1

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

axes.spines является OrderedDict. Когда вы перебираете Dict или OrderedDict следующим образом:

for key in axes.spines:
    print(type(key))

Вы перебираете ключи, которые являются строками и не имеют метода обновления. Здесь вы можете увидеть, какие параметры можно установить с помощью plt.setp(), просто передав итерируемый объект или подобный объект.

plt.setp(axes.spines)

Возвращает None, поскольку оно ссылается на ключи, которые являются строками и не имеют метода обновления. Вдоль этой строки логики c, если мы попробуем это:

plt.setp(axes.spines.values())

, мы увидим, что это возвращает возможные аргументы. Таким образом, в итоге, изменение plt.setp(axes.spines, visible=False) на plt.setp(axes.spines.values(), visible=False) удалит все шипы, так как он выполняет итерацию по объектам, а не по ключам.

Полный код:

import matplotlib.pyplot as plt

x = range(0,10)
y = [i*i for i in x]

plt.plot(x,y) #Plotting x against y
axes = plt.gca() #Getting the current axis

axes.spines['top'].set_visible(False)

plt.setp(axes.spines.values(), visible=False) 

plt.show() #Showing the plot
0 голосов
/ 29 апреля 2020

Я опубликую свое отчаянное решение, только для протокола, и если это может кому-нибудь помочь. Хотя ответ @ axe319 трудно переоценить.

Мне просто нужно было перебрать имена имен позвоночников:

spine_names = ('top','right', 'bottom', 'left')
for spine_name in spine_names:
    axes.spines[spine_name].set_visible(False)

Это работает, но не так элегантно и гибко, и, очевидно, отказывается от использования setp: - \

Предупреждение: Кто-то может подумать, что альтернативным решением является

axes.set_frame_on(False)

Но совсем нет. Я попробовал это. Хотя он, безусловно, скрывает все оси одновременно, используя set_visible(False), впоследствии команда axes.spines[spine_name].set_visible(True) не работает!

...