让垂直网格线出现在 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,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='--')
这种方法让我们可以更好地控制网格线的显示内容。
【讨论】:
【参考方案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)