You need to enable JavaScript to run this app. 如何修改Matplotlib代码匹配目标图的曲线宽度、灰度映射与阴影效果
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.12 21:54:03