【问题标题】:Fill area under function with a continuous normalized colormap使用连续标准化颜色图填充函数下的区域
【发布时间】:2020-05-16 08:39:15
【问题描述】:

这是取自 Mathematica 的示例。

Plot[Abs[Exp[2 I x - x^2/2]], {x, -4, 4}, Filling -> Axis,
FillingStyle -> Automatic,
ColorFunction -> Function[{x, y}, Hue[Rescale[Arg[Exp[2 I x - x^2/2]], {-Pi, Pi}]]],
ColorFunctionScaling -> False]

生成下图

我想在 python 中制作一个等效的图。 matplotlib 是否有等效的颜色函数选项?

【问题讨论】:

    标签: python matplotlib plot graph colormap


    【解决方案1】:

    这并不像您的 Mathematica 示例那么优雅,但以下代码在 matplotlib 中复制了您的示例。基本思想是将函数绘制为不可见的多边形,显示标准化颜色图的图像(使用自定义范数函数将值包裹在 ±pi/2 之外),然后将函数多边形作为剪贴蒙版应用到该图像。

    代码:

    # Function (improve smoothness of plot by increasing samples from 500)
    x = np.linspace(-4,4,500)
    y = abs(np.e**(2j*x - x**2/2))
    
    # Set up figure
    fig, ax = plt.subplots()
    ax.set_ylim(ymin=0, ymax=1)
    
    # Plot line without fill
    line, = ax.fill(x, y, facecolor='none')
    
    # Reshape x data for applying cmap
    img_data = x.reshape(1, x.size)
    
    # Set up norm between + and - pi/2
    norm = mpl.colors.Normalize(vmin=-np.pi/2, vmax=np.pi/2)
    
    # Use hsv cmap (cyclic rainbow)
    cmap=plt.cm.hsv
    
    # Function to apply norm cyclicly
    def f(x):
        return norm(x)%1
    
    # Apply modified norm to img_data
    cmap_data = f(img_data)
    
    # Get limits
    xmin, xmax = np.min(x), np.max(x)
    ymin, ymax = np.min(y), np.max(y)
    
    # Show cmap image
    im = ax.imshow(cmap_data, aspect='auto', cmap=cmap, extent=[xmin,xmax,ymin,ymax])
    
    # Clip image along line
    im.set_clip_path(line)
    

    输出:

    【讨论】:

    • 乍一看似乎有点复杂,但它可能与 Mathematica 在后台所做的非常相似,并且将其包装在单个函数中应该使其与 Mathematica 版本一样易于访问。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2012-10-13
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多