首页 > 解决方案 > 如何在 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()

标签: pythonmatplotlib

解决方案


网格线应始终到达轴,与轴限制无关。因此,您需要的是一条线,其一端定义在混合坐标系中,其中一个坐标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()

在交互式缩放或平移绘图时,可以观察到此代码与其他答案的主要区别。

在此处输入图像描述


推荐阅读