修改 matplotlib.pyplot 图中的网格
Posted
技术标签:
【中文标题】修改 matplotlib.pyplot 图中的网格【英文标题】:Modifying the Grid in matplotlib.pyplot graph 【发布时间】:2022-01-24 00:44:46 【问题描述】:我是 Python 的新手,但慢慢就到了那里。我在尝试增加图表上的网格线数量时遇到问题。基本上,图表标记为 0-24(小时),但 x 轴仅每 5 小时(O、5、10、15、20)生成一个标签,每个专业都有一条网格线。理想情况下,我希望在收集实时数据时每隔一小时绘制一条网格线。
大部分代码都来自各种来源,但让我难过的一件事是如何配置网格..
编辑 - 根据要求,我的简化代码如下..
import numpy as np
import matplotlib.pyplot as plt
import time
timedata=[0.01,1.1,2.2,3.3,4.4,5.55,6.6,7.7,8.8,9.1,10.2,11.2,12.2,13.2,14.1,15.2,16.1,17.2,18.1,19.2,20.1,21.1,22.2,23.1]
#timedata is in decimal hours
bxdata=[10,10,20,20,20,30,30,30,40,40,40,30,30,30,20,20,30,30,20,20,40,50,30,24]
bydata=[20,10,20,30,20,30,30,30,5,40,40,30,5,30,20,20,30,35,20,20,5,50,30,24]
#draw the graph
fig, ax = plt.subplots(sharex=True, figsize=(12, 6))
x=np.arange(0,24,1)
ax.plot(timedata,bxdata, color='red', label='Bx',lw=1)
ax.plot (timedata, bydata, color='blue', label = 'By',lw=1)
ax.set_xlim(0,24)
ax.set_ylim(-250,250)
plt.ion()
plt.xlabel("Time (Hours)")
plt.ylabel("nT")
plt.grid(True, which='both')
plt.legend()
plt.show()
image = "test.png"
time.sleep(2)
plt.savefig(image)
plt.close('all')
这是我得到的图表。
【问题讨论】:
嗨马丁,欢迎来到 ***!请准备minimal, reproducible example。我们会更容易为您提供帮助。也看看this answer,因为它可能会解决你的问题 感谢您的回复。我已经查看了建议的修复程序。它没有做我需要它做的事情。图表需要预先格式化,X 轴和 Y 轴预先格式化超过 24 小时。这是我的简化代码,用作测试。实际上,我每 15 秒收集一次数据样本,但这显示了效果。 【参考方案1】:这个想法是将定位器与次要 x 轴刻度相关联,您需要的定位器是 MultipleLocator
,我们还使用它来修复主要刻度的间距(对于小时,6 比 5 好,不是是吗?)
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
y = np.random.rand(25)
plt.plot(y)
plt.gca().xaxis.set_major_locator(MultipleLocator(6))
plt.gca().xaxis.set_minor_locator(MultipleLocator(1))
plt.grid()
plt.grid(True, 'minor', color='#ddddee') # use a lighter color
plt.show()
【讨论】:
【参考方案2】:如果您将 x 轴间距设置为任何所需的间隔,网格将自动与其一起绘制。有面向对象格式和绘图格式的混合,所以统一使用对象格式。
import numpy as np
import matplotlib.pyplot as plt
import time
timedata=[0.01,1.1,2.2,3.3,4.4,5.55,6.6,7.7,8.8,9.1,10.2,11.2,12.2,13.2,14.1,15.2,16.1,17.2,18.1,19.2,20.1,21.1,22.2,23.1]
#timedata is in decimal hours
bxdata=[10,10,20,20,20,30,30,30,40,40,40,30,30,30,20,20,30,30,20,20,40,50,30,24]
bydata=[20,10,20,30,20,30,30,30,5,40,40,30,5,30,20,20,30,35,20,20,5,50,30,24]
#draw the graph
fig, ax = plt.subplots(sharex=True, figsize=(12, 6))
x=np.arange(0,24,1)
ax.plot(timedata,bxdata, color='red', label='Bx',lw=1)
ax.plot(timedata, bydata, color='blue', label='By',lw=1)
ax.set_xlim(0,24)
ax.set_ylim(-250,250)
# plt.ion()
ax.set_xticks(np.arange(0,24,1))
ax.set_xlabel("Time (Hours)")
ax.set_ylabel("nT")
ax.grid(True, which='both')
ax.legend()
# image = "test.png"
# time.sleep(2)
# plt.savefig(image)
# plt.close('all')
plt.show()
【讨论】:
有关coding styles的更多信息,请参阅此信息。如果您觉得我的回答对您有帮助,请点击回答旁边的复选标记以接受回答。 那个解决方案也很完美。非常感谢以上是关于修改 matplotlib.pyplot 图中的网格的主要内容,如果未能解决你的问题,请参考以下文章
Python可视化31|matplotlib-图添加文本(text)及注释(annotate)
Python 绘图包 Matplotlib Pyplot 教程