使用 setp 隐藏坐标轴脊柱

Using setp to hide axes spines

我试图在 matplotlib 中使用 setp 将书脊的可见性设置为 False,但出现错误“AttributeError: 'str' object has no attribute 'update'”。 据我了解,使用 setp 我们可以更改可迭代对象的属性,并希望使用 spines.

来执行它

有效使用 setp 的正确语法是什么?

他是一个 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

axes.spines 是一个 OrderedDict。当您像这样遍历 DictOrderedDict 时:

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

您正在迭代键,这些键是字符串并且没有更新方法。 Here 您可以通过像这样传入可迭代对象或对象来查看可以使用 plt.setp() 设置哪些参数。

plt.setp(axes.spines)

这个returns None,因为它指的是键,它们是字符串并且没有更新方法。 沿着这条逻辑线,如果我们尝试这样做:

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

我们看到这确实 return 可能的论点。 因此,总而言之,将 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

我会 post 我的绝望解决方案,仅供记录,如果它可能对某人有所帮助。尽管@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) 不起作用!