温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Fill area under function with a continuous normalized colormap
graph matplotlib plot python colormap

python - 使用连续的归一化颜色图填充功能下方的区域

发布于 2020-03-30 21:42:48

这是取自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是否有等效的colorfunction选项?

查看更多

提问者
Turbotanten
被浏览
88
CDJB 2020-01-31 19:20

这并不像您的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)

输出:

在此处输入图片说明