如何在Matplotlib绘制的线条上方填充阴影?
为网格图线条上方区域填充阴影的实现方法
我绘制了一个带有线条的网格图,代码如下:
import matplotlib.pyplot as plt import numpy as np # 绘制网格并在每个方格中填充-3到3之间的随机整数 np.random.seed(42) # 设置随机种子保证结果可复现 square = np.zeros((10, 10), dtype=np.int_) for x in np.arange(0.5, 10, 1): for y in np.arange(0.5, 10, 1): value = np.random.randint(-3, 4) square[int(x), int(y)] = value plt.text(x-0.2, y-0.2, str(value), ha='center', va='center', fontsize=8, color='black') # 计算方格中心坐标并添加蓝色小点 for x in np.arange(0.5, 10, 1): for y in np.arange(0.5, 10, 1): plt.scatter(x, y, color='blue', s=1) # 可调整点的大小(s) x_points = [7, 2] y_points = [0, 10] plt.plot(x_points, y_points) # 自定义绘图样式 plt.xlim(0, 10) plt.ylim(0, 10) plt.yticks(np.arange(0, 10.01, 1)) plt.xticks(np.arange(0, 10.01, 1)) plt.gca().invert_yaxis() plt.gca().set_aspect('equal', adjustable='box') plt.grid()
效果如图:

需求:为线条上方(包含左上角方格的区域)填充阴影。
实现方案
要填充目标区域,可利用Matplotlib的fill_between函数,步骤如下:
- 推导直线方程:已知线条端点(7,0)和(2,10),计算得直线斜率为
-2,方程为y = -2x + 14。 - 生成填充坐标点:用
linspace生成x轴范围内的连续点,代入直线方程得到对应y值,保证填充区域平滑。 - 执行填充:调用
fill_between指定填充范围,设置颜色和透明度避免遮挡原有内容。
修改后的完整代码:
import matplotlib.pyplot as plt import numpy as np # 绘制网格并在每个方格中填充-3到3之间的随机整数 np.random.seed(42) # 设置随机种子保证结果可复现 square = np.zeros((10, 10), dtype=np.int_) for x in np.arange(0.5, 10, 1): for y in np.arange(0.5, 10, 1): value = np.random.randint(-3, 4) square[int(x), int(y)] = value plt.text(x-0.2, y-0.2, str(value), ha='center', va='center', fontsize=8, color='black') # 计算方格中心坐标并添加蓝色小点 for x in np.arange(0.5, 10, 1): for y in np.arange(0.5, 10, 1): plt.scatter(x, y, color='blue', s=1) # 可调整点的大小(s) x_points = [7, 2] y_points = [0, 10] plt.plot(x_points, y_points) # ------------------- 添加填充阴影的代码 ------------------- # 生成x轴范围内的连续点,用于绘制平滑的填充区域 x_fill = np.linspace(0, 10, 100) # 根据直线方程计算对应的y值 y_fill = -2 * x_fill + 14 # 填充线条上方的区域(y轴反转后,上方对应y=10方向) plt.fill_between(x_fill, y_fill, 10, color='gray', alpha=0.3) # --------------------------------------------------------- # 自定义绘图样式 plt.xlim(0, 10) plt.ylim(0, 10) plt.yticks(np.arange(0, 10.01, 1)) plt.xticks(np.arange(0, 10.01, 1)) plt.gca().invert_yaxis() plt.gca().set_aspect('equal', adjustable='box') plt.grid() plt.show()
说明
alpha=0.3设置填充透明度,兼顾阴影效果和内容可见性。- 由于y轴被反转,图中“上方”对应数值更大的y值,因此填充从直线到
y=10的区域正好是目标的左上角区域。
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

