【发布时间】:2017-07-06 22:40:31
【问题描述】:
我想绘制光谱图,其中曲线下的区域将根据相应的光颜色进行着色。很像这个情节:
我试图在 matplotlib 中模拟这一点,通过使用 imshow 和 spectral 颜色图来绘制颜色,并使用白色 fill_between 来覆盖曲线上方的区域。我对结果相当满意,除了两件事:
1) 我绘制的颜色与可见光谱不太一致。例如,当它是红色时,我将 700 nm 显示为黄色/橙色。我对某种风格化的表示感到满意(例如,我认为第二个答案here 中显示的准确颜色很无聊),但总的来说,我希望波长与它们的可见颜色对齐。
2) 我喜欢上面的光谱如何将可见区域之外的区域用 alpha
这是我目前所拥有的:
import numpy as np
import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 1, figsize=(8,4), tight_layout=True)
wavelengths = np.linspace(200, 1000, 1000)
spectrum = (5 + np.sin(wavelengths*0.1)**2) * np.exp(-0.00002*(wavelengths-600)**2)
plt.plot(wavelengths, spectrum, color='darkred')
y = np.linspace(0, 6, 100)
X,Y = np.meshgrid(wavelengths, y)
X[X<400] = 400
extent=(np.min(wavelengths), np.max(wavelengths), np.min(y), np.max(y))
plt.imshow(X, clim=(350,820), extent=extent, cmap=plt.get_cmap('spectral'), aspect='auto')
plt.xlabel('Wavelength (nm)')
plt.ylabel('Intensity')
plt.fill_between(wavelengths, spectrum, 8, color='w')
plt.savefig('WavelengthColors.png', dpi=200)
plt.show()
【问题讨论】:
-
我不明白你为什么说链接问题中的第二个答案很无聊,这不正是你需要的吗?
-
我想我希望颜色图最终在 400 nm 处呈现紫色并具有青色部分。即使这比该答案中的物理性要少,我认为它看起来会更好。
-
我认为您不能像这样重写/操作 cmap,但您可以使用 matplotlib 的 reference 创建一个,并使用已知算法,如链接的答案中的算法。
标签: python matplotlib