python - 如何在 matplotlib 中绘制受数据点限制的网格
问题描述
我有一个子图,我想通过绘制与轴平行但仅填充轴和数据点之间的空间(普通网格超出数据点)的网格线来强调数据点。
我知道有多种方法可以在 matplotlib 中绘制线条和矩形。我可以遍历我的数据并为从 (0, 0) 开始的每个数据点绘制一个矩形。但我想知道是否有办法更轻松地做到这一点。
普通网格: https ://i.imgur.com/0xofyfG.png
我想要的网格: https ://i.imgur.com/lvM3ZBC.png
编辑:这是我的代码的精简版本,其中包含我想要的所有子图,正如我所描述的那样。
from matplotlib import pyplot as plt
x_data1 = [1, 2, 5, 7, 20]
y_data1 = [5.20, 10.40, 26.00, 36.40, 104.00]
y_data2 = [3.7, 7.4, 18.5, 25.9, 74]
y_data3 = [8.95, 17.9, 44.75, 62.65, 179]
fig, ax = plt.subplots(1, 3, figsize=(12, 3), tight_layout=True, sharey="all")
ax[0].plot(x_data1, y_data1, marker="o")
ax[0].grid(which="major", linestyle="--", color="black", alpha=0.3)
ax[0].set_xticks(x_data1)
ax[0].set_yticks(y_data1)
ax[0].set_ylim(bottom=0)
ax[0].set_title("Multiplier: 5.2")
ax[1].plot(x_data1, y_data1,
x_data1, y_data2, marker="o")
ax[1].set_title("Mult.: 5.2, Mult.: 3.7")
ax[2].plot(x_data1, y_data1,
x_data1, y_data3, marker="o")
ax[2].set_title("Mult.: 5.2, Mult.: 8.95")
plt.show()
解决方案
网格线应始终到达轴,与轴限制无关。因此,您需要的是一条线,其一端定义在混合坐标系中,其中一个坐标0
位于轴坐标中。另一端将完全位于数据坐标中。实现这一目标的一种方法是使用matplotlib.patches.ConnectionPatch
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch
data_x = [1,2,5,7,20]
data_y = [5.2,10.40, 26.00, 36.40,104.00]
fig, ax = plt.subplots()
# Create your own grid
for x,y in zip(data_x, data_y):
cp1 = ConnectionPatch((x,0), (x,y),
coordsA=ax.get_xaxis_transform(),
coordsB="data", axesA=ax, axesB=ax,
color='grey', linestyle='--', )
cp2 = ConnectionPatch((0,y), (x,y),
coordsA=ax.get_yaxis_transform(),
coordsB="data", axesA=ax, axesB=ax,
color='grey', linestyle='--')
ax.add_patch(cp1)
ax.add_patch(cp2)
plt.scatter(data_x, data_y, color='black')
plt.plot(data_x, data_y, color='black')
plt.margins(x=0, y=0)
plt.xticks(data_x)
plt.yticks(data_y)
plt.show()
在交互式缩放或平移绘图时,可以观察到此代码与其他答案的主要区别。
推荐阅读
- r - R - 如何将十进制转换为 MM:SS.XXX
- android - 底部导航项按下手机后退键退出应用
- python - getattr() 和调用属性有什么区别?
- angular - 图像未加载到 mat-carousel-slide
- python - 我进入 django 找不到页面
- google-app-engine - Google Cloud App Engine 实例类/CPU 速度
- php - 我的一些静态和动态图像链接在实时 vps ubuntu 服务器上被破坏,但在本地 xampp 服务器上工作
- xml - books.xml 转换为 CSV:在每一行上重复标题
- python-3.x - python - os.startfile(filename) 正在打开任务栏上的文件
- python - “for x in vectors: for y in vectors:”的矩阵,没有两个 for 循环