让垂直网格线出现在 matplotlib 的线图中

Posted

技术标签:

【中文标题】让垂直网格线出现在 matplotlib 的线图中【英文标题】:Getting vertical gridlines to appear in line plot in matplotlib 【发布时间】:2013-04-11 01:30:07 【问题描述】:

我想在我的绘图上同时获得水平和垂直网格线,但默认情况下只显示水平网格线。我在 python 中使用来自 sql 查询的pandas.DataFrame 来生成带有 x 轴上日期的线图。我不确定为什么它们没有出现在日期上,我试图寻找答案但找不到。

我用来绘制图表的只是下面的简单代码。

data.plot()
grid('on')

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

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

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

有什么建议吗?

【问题讨论】:

data.plot(grid="on") 为我工作 【参考方案1】:

您可能需要在调用中提供布尔参数,例如使用ax.yaxis.grid(True) 而不是ax.yaxis.grid()。此外,由于您同时使用它们,因此您可以合并到 ax.grid,这对两者都有效,而不是对每个维度都执行一次。

ax = plt.gca()
ax.grid(True)

这应该可以解决您的问题。

【讨论】:

我试过了,但由于某种原因,它看起来还是和以前一样 您是在交互式解释器中这样做吗?确保在调用plt.show() 之前 设置网格 我正在使用 iPython。我已经尝试添加 plt.show() 它不会有所作为。 这很奇怪。你的 ipython 版本是什么,也可以尝试像 ipython --pylab 一样运行它,然后立即运行 plt.grid(True) - 你看到网格了吗? 我尝试了plt.grid(True) 并得到了带有垂直和水平网格线的空图,所以是的,为什么我的线图不能得到这个很奇怪。我正在运行最新版本的 iPython。【参考方案2】:

plt.gca().xaxis.grid(True) 被证明是我的解决方案

【讨论】:

myaxes.grid(which='x') 不适用于 matplotlib 版本 1.4.2... 根本无法使用 which 关键字。然而,myaxes.xaxis.grid(True) 成功了,并且在概念上更适合 IMO。哦,别忘了有用的myaxes.set_axisbelow(True) 方法将网格放在数据后面。【参考方案3】:

According to matplotlib documentation,Axesgrid()方法的签名如下:

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='--')

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

【讨论】:

【参考方案4】:

也许这可以解决问题: matplotlib, define size of a grid on a plot

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

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

【讨论】:

【参考方案5】:

简答(阅读下文了解更多信息):

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

你所做的是正确的,它应该有效。

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

ax.grid() 方法默认在主要刻度线上绘制网格线。 因此,您的情节中没有任何内容。

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

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='-')

【讨论】:

【参考方案6】:

仅适用于水平线

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

成功了

【讨论】:

【参考方案7】:

试试:

plt.grid(True)

这会打开日期系列的水平和垂直网格,主要刻度线在正确的位置。

使用 Python3 / MatPlotLib 3.4.3

【讨论】:

以上是关于让垂直网格线出现在 matplotlib 的线图中的主要内容,如果未能解决你的问题,请参考以下文章

python使用matplotlib可视化线图(line plot)并自定义设置可视化图像中没有网格线(remove grid line in matplotlib plot result)

顶部带有线的多轴图。 Matplotlib

python3绘图示例4(基于matplotlib:箱线图散点图等)

Matplotlib:在其他图形元素后面绘制网格线

为图像插入水平线和垂直线——Matplotlib库示例

为图像插入水平线和垂直线——Matplotlib库示例