如何在使用Seaborn + Pandas绘图时,消除辅助y轴上的网格线?

49

我正在使用导入seaborn的Pandas绘制两个数据系列。理想情况下,我希望左右y轴之间共享水平网格线,但我认为这很难做到。

为了妥协,我想完全删除网格线。然而,以下代码会为次要y轴生成水平网格线。

import pandas as pd
import numpy as np
import seaborn as sns


data = pd.DataFrame(np.cumsum(np.random.normal(size=(100,2)),axis=0),columns=['A','B'])
data.plot(secondary_y=['B'],grid=False)

我想要去掉的网格线


你在使用什么颜色偏好设置?这张图片不是matplotlib的默认设置。我敢打赌这就是问题的原因。 - DataSwede
@DataSwede 看起来对我来说是默认的pandas方案...而且我也得到了那些行 - Ajean
我的答案适用于seaborn吗?我从未使用过它,无法确定它是否会有帮助。 - DataSwede
是的,它可以与seaborn一起使用。 - Artturi Björk
5个回答

67

在绘图后,您可以将Axes对象取出并在两个轴上执行.grid(False)

# Gets the axes object out after plotting
ax = data.plot(...)

# Turns off grid on the left Axis.
ax.grid(False)

# Turns off grid on the secondary (right) Axis.
ax.right_ax.grid(False)

2
ax.grid(False) 是唯一对我有效的方法。谢谢。 - Chuck
2
这是最好的答案,因为你可以在seaborn、pandas和matplotlib中都使用它。只需在需要的任何轴上调用 ax.grid(False) 即可。 - Ryszard Cetnarski

60
sns.set_style("whitegrid", {'axes.grid' : False})

请注意,样式可以选择任何有效的样式。

关于这个问题的一个不错的文章,请参考这个网站


10

问题在于使用默认的pandas格式(或者您选择的任何格式)。不确定幕后的工作原理,但是这些参数会胜过您在绘图函数中传递的格式。您可以在mpl_style字典中看到它们的列表

为了解决这个问题,您可以这样做:

import pandas as pd
pd.options.display.mpl_style = 'default'
new_style = {'grid': False}
matplotlib.rc('axes', **new_style)
data = pd.DataFrame(np.cumsum(np.random.normal(size=(100,2)),axis=0),columns=['A','B'])
data.plot(secondary_y=['B'])

在此输入图片描述


我不确定是否应将此标记为已接受的答案,因为它肯定有效,但如果有一种在seaborn中“本地”执行此操作的方法,那就太好了。 - Artturi Björk

6
这似乎是Pandas中的错误行为,不是所有的关键字参数都被传递给两个Axes。但如果你想在seaborn中默认关闭网格,只需要调用。如果你只想更改一个图的默认设置,也可以在语句中使用。

5

您只需要设置:

sns.set_style("ticks")

它就会恢复正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接