如何修改Matplotlib代码匹配目标图的曲线宽度、灰度映射与阴影效果
Matplotlib 曲线平行灰度阴影效果适配方案
核心改造思路
将原代码中垂直平移叠线的逻辑替换为参考实现的「逐段法向平行偏移」逻辑,彻底避免曲线斜率较大位置的阴影偏移失真,完全匹配参考示例的线条层次、灰度渐变效果。
关键调整项
- 保留原代码目标绘制的四次多项式函数:
y = -(1/4*x**4 - 1.6*x**2),不替换为参考示例中的二次抛物线 - 统一使用反向灰度色卡
Greys_r,按t/2 + 0.25的规则取色,保证阴影从靠近曲线的深灰向边缘浅灰平滑过渡 - 复用参考实现的逐段法向偏移计算逻辑,所有偏移量按y轴总范围比例缩放,保证阴影扩散范围和参考图完全一致
- 删除原代码中针对彩虹多色线设计的6层轮廓偏移、resize事件回调等冗余逻辑,这部分和当前平行阴影需求无关
可直接运行的优化后代码
import numpy as np import matplotlib.pyplot as plt import math dpi = 100 # 逐段计算法向平行偏移点的函数 def get_parallels(x, y, length=0.1): px, py = [], [] for idx in range(len(x)-1): x0, y0 = x[idx], y[idx] xa, ya = x[idx+1], y[idx+1] dx, dy = xa - x0, ya - y0 norm = math.hypot(dx, dy) * (1 / length) dx /= norm dy /= norm px.append(x0 - dy) py.append(y0 + dx) return px, py fig, ax = plt.subplots(figsize=(4, 2.5), dpi=dpi) cmap = plt.get_cmap('Greys_r') # 原目标四次多项式定义 x = np.linspace(-3, 3, 100) y = -(1/4 * x**4 - 1.6 * x**2) # 设置匹配的坐标轴范围,保证阴影占比和参考一致 ax.set_ylim(-6, 3) width_l = ax.get_ylim()[1] - ax.get_ylim()[0] # 循环绘制不同偏移量的平行曲线,叠成灰度阴影 for t in np.linspace(0, 1, 40): length = -0.1 * width_l * t px, py = get_parallels(x, y, length=length) ax.plot(px, py, color=cmap(t/2 + 0.25)) plt.tight_layout() plt.show()
效果匹配说明
运行上述代码后,生成的阴影会沿着四次多项式轮廓的法向方向向外连续扩散:
- 阴影的线条密度(40层平行曲线)和参考完全一致
- 灰度渐变规则和参考统一,从贴近曲线的深灰色逐步过渡到阴影边缘的浅灰色
- 阴影扩散范围占坐标轴高度的10%,和参考图的视觉占比完全匹配
- 不存在原代码垂直平移导致的、曲线斜率较大位置的阴影歪斜问题
内容的提问来源于stack exchange,提问作者Elena Greg
相关产品推荐
相关产品推荐

