如何在matplotlib柱状图后面绘制网格线

86
x = ['01-02', '02-02', '03-02', '04-02', '05-02']
y = [2, 2, 3, 7, 2]

fig, ax = plt.subplots(1, 1)
ax.bar(range(len(y)), y, width=0.3,align='center',color='skyblue')
plt.xticks(range(len(y)), x, size='small')
plt.savefig('/home/user/graphimages/foo2.png')
plt.close()
我希望在柱状图后面画上网格线(x和y轴的)。

我想在柱形图背后绘制网格线(x和y轴)。

5个回答

133
要添加网格,您只需要添加

ax.grid()

如果您希望网格在条形图后面,则添加以下内容:
ax.grid(zorder=0)
ax.bar(range(len(y)), y, width=0.3, align='center', color='skyblue', zorder=3)

重要的部分是条形图的zorder大于网格。经过实验,似乎zorder = 3是实际上能产生所需效果的最低值。我不知道为什么zorder = 1不足够。
编辑:我注意到这个问题已经在here使用了不同的方法得到了答案,尽管它遭受了一些链接失效的问题。两种方法在我看来产生了相同的结果,但andrew cooke的答案更优雅。

8
虽然这不是这个问题的一部分,但需要注意的是如果通过 yerrxerr 指定了误差条,这种解决方案将无法工作(填充的条将掩盖它们);对于这种情况,使用 ax.set_axisbelow() 可以解决。 - aseagram
8
如上所述,这不能与误差线一起使用。为了完整起见,命令 ax.set_axisbelow() 需要一个正确的语句,即 ax.set_axisbelow(True) - Austin Downey
如果我使用 ax.yaxis.grid(True) 只显示水平网格,那么添加 ax.grid(zorder=0) 将会显示垂直网格。 - weefwefwqg3
也许图形面在zorder == 0,轴面在zorder == 1?没有测试过这个理论。 - spacecowboy
1
这个链接对我有帮助 https://dev59.com/iXI-5IYBdhLWcg3wsKl4 ,但是使用zorder方法不起作用。 - baxx
似乎设置条形图的zorder是最重要的。我可以将条形图的zorder设置为2,将网格的zorder设置为100,但是条形图仍然出现在网格上方。我不理解这种行为。实际上,我已经尝试了从-1到100的几个数字,当条形图的zorder=2时,所有我尝试过的数字都有效。 - amquack

26

由于得票最高的答案对我无效,我建议另一种解决方案。您可以使用以下代码将网格线设置在图表后面。

ax.set_axisbelow(True)
ax.grid(color='gray', linestyle='dashed')

我从这篇答案中得到了这段代码。


3
plt.grid(True, color = "grey", linewidth = "1.4", linestyle = "-.")

这对我很有帮助,网格线将会以灰色边框颜色显示,如果你想改变边框样式为linestyle = ".." 像这样。
plt.grid(True, color = "grey", linewidth = "1.4", linestyle = "..")

总结整个代码块:
fig, ax = plt.subplots(1, 1)
ax.bar(range(len(y)), y, width=0.3,align='center',color='skyblue')
plt.xticks(range(len(y)), x, size='small')
plt.grid(True, color = "grey", linewidth = "1.4", linestyle = "-.")
plt.savefig('/home/user/graphimages/foo2.png')
plt.close()

ValueError: '..' is not a valid value for ls; supported values are '-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted' - Michel de Ruiter

0
使用.grid()将顺序设置为0(后面)。
ax.grid(zorder=0)

-3

ax.grid(zorder=0)会起作用。但是先放置Bar,然后再放置Grid。不要反过来。

ax = df.plot.bar(x='Index', y='Values', rot=90)
ax.grid(zorder=0)

我对一些货币与年份的相关性进行了处理,并将其排序为我的数据框df,下面是代码运行的结果。 我对一些货币与年份的相关性进行了处理,并将其排序为我的数据框df


5
所有的网格线似乎都在条形图上方,而不是背后。 - baxx

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