在matplotlib中使线图出现垂直网格线

125

我希望在我的图表上同时获取水平和垂直网格线,但默认情况下只出现了水平网格线。我正在使用Python中的SQL查询生成pandas.DataFrame,并在x轴上放置日期进行线性绘图。我不确定为什么它们不会出现在日期上,我已经尝试搜索答案,但没有找到。

我所使用的代码很简单,如下所示。

data.plot()
grid('on')

data是DataFrame,其中包含了来自sql查询的日期和数据。

我也尝试添加下面的代码,但仍然得到相同的输出结果,没有垂直网格线。

ax = plt.axes()        
ax.yaxis.grid() # horizontal lines
ax.xaxis.grid() # vertical lines

有什么建议吗?

enter image description here


data.plot(grid="on") 对我很有帮助。 - Markus
7个回答

121
在你的调用中可能需要给出布尔参数,例如使用ax.yaxis.grid(True)而不是ax.yaxis.grid()。此外,由于你同时使用这两个参数,你可以将它们合并为ax.grid,它可以在两个维度上同时使用,而不是每个维度都使用一次。
ax = plt.gca()
ax.grid(True)

那应该能解决你的问题。


1
我尝试过了,但出于某种原因它仍然看起来和之前一样。 - Osmond Bishop
1
你是在交互式解释器中进行吗?确保在调用plt.show()之前设置网格。 - wim
1
这很奇怪。你的ipython版本是什么?也尝试像这样运行它 ipython --pylab,并立即执行 plt.grid(True) - 你能看到网格吗? - wim
也许在00:00时有一个格子,而其他时间没有格子。我遇到了同样的问题,即11月1日只有一个格子,而其他日期没有格子。 - Lory_yang
只需要 plt.grid(True) 就可以了。 - Paul Kenjora
显示剩余2条评论

69

plt.gca().xaxis.grid(True)对我来说是解决方案


7
版本1.4.2的Matplotlib中,myaxes.grid(which='x') 无法正常工作...我无法让 which 关键字起作用。不过,myaxes.xaxis.grid(True) 可以解决问题,而且在我看来概念上更好。哦,还有别忘了有用的 myaxes.set_axisbelow(True) 方法,将网格线放在数据后面。 - travc

36

根据matplotlib文档, Axes类的grid()方法的签名如下:

Axes.grid(b=None, which='major', axis='both', **kwargs)
打开或关闭坐标轴网格线。

which默认为'major',也可以设置为'minor'或'both',以控制影响主刻度网格、副刻度网格还是两者都影响。

axis默认为'both',也可以设置为'x'或'y',以控制绘制哪组网格线。

因此,为了同时显示x轴和y轴的网格线,我们可以使用以下代码:

ax = plt.gca()
ax.grid(which='major', axis='both', linestyle='--')

这种方法让我们更精细地控制网格线的显示内容。


16

简短回答(请继续阅读以下内容获取更多信息):

ax.grid(axis='both', which='both')

enter image description here

您所做的是正确的,应该可以工作。

但是,由于您的示例中X轴是一个DateTime轴,因此Major刻度线(很可能)仅出现在X轴的两端。其他可见的刻度线是Minor刻度线。

ax.grid()方法默认会在Major刻度线上绘制网格线。因此,在您的图表中什么也没有显示。

使用下面的代码突出显示刻度线。主要刻度线将为蓝色,次要刻度线将为红色。

ax.tick_params(which='both', width=3)
ax.tick_params(which='major', length=20, color='b')
ax.tick_params(which='minor', length=10, color='r')

现在要强制网格线也出现在次刻度上,将which='minor'传递给该方法:

ax.grid(b=True, which='minor', axis='x', color='#000000', linestyle='--')

或者只需使用which='both'来绘制主要和次要网格线。

这是一种更优雅的网格线:

ax.grid(b=True, which='minor', axis='both', color='#888888', linestyle='--')
ax.grid(b=True, which='major', axis='both', color='#000000', linestyle='-')

8
也许这个可以解决问题:matplotlib, define size of a grid on a plot
ax.grid(True, which='both')

事实上,网格正在工作,但是在00:00只有一个v-grid,在其他时间没有网格。我遇到了同样的问题,11月1日中只有一个网格。


4
仅针对水平线:
ax = plt.axes()        
ax.yaxis.grid() # horizontal lines

这个有效了。


0

尝试:

plt.grid(True)

这将为日期系列打开水平和垂直网格,并在正确的位置上显示主刻度标记。

使用 Python3 / MatPlotLib 3.4.3


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