matplotlib 如何用随斜率变化的颜色填充折线图?

oxalkeyp  于 2023-10-24  发布在  其他
关注(0)|答案(3)|浏览(122)

我想做一个类似于这个的图(一个高程图):

这里他们绘制了海拔与距离的关系,图下的区域用斜率(即,dElevation/dx)着色。红色是正斜率,绿色是平坦的,蓝色是负斜率。
如果我有x和高程,就很容易计算出斜率(dElevation/dx),但我不知道如何用随斜率变化的颜色填充图形。

ig9co6j1

ig9co6j11#

主要使用this approach并对其进行一点调整,使其成为可能:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch

x = np.arange(0,10,0.1)
y = 0.5*np.sin(x)+0.6
grad = np.gradient(y)
elevation_origin = -0.05 # set the zero line until which the color map is filled in. 

fig,ax = plt.subplots(1,1)
ax.plot(x, y, label='Elevation')

path = Path(np.array([np.append(x,x[::-1]), np.append(y,np.zeros_like(y))]).T)
patch = PathPatch(path, facecolor='none')
ax.add_patch(patch)
im = plt.imshow(grad.reshape(1,y.size), cmap=plt.cm.jet, interpolation='bicubic',                                        
                extent=[x[0], x[-1], elevation_origin, np.max(y)],aspect='auto',               
                clip_path=patch, clip_on=True)     
plt.show()

当然,如果需要,您可以选择不同的颜色Map,但jet应该与您的示例图片相匹配。请注意,如果有海拔低于elevation_origin,则需要修改此方法。还请注意,这是可以通过网络搜索找到的(至少大部分)。

niknxzdl

niknxzdl2#

我只是想分享一个替代版本的答案上面。
而不是:

im = plt.imshow(grad.reshape(1,y.size), cmap=plt.cm.jet, interpolation='bicubic',                                        
                extent=[x[0], x[-1], elevation_origin, np.max(y)],aspect='auto',               
                clip_path=patch, clip_on=True)

我用的是:

cmap = mpl.cm.bwr
normalize = mpl.colors.Normalize(vmin=np.min(grad), vmax=np.max(grad))
for i in range(0,100):
    plt.fill_between(x=x[i-1:i+1],y1=y[i-1:i+1],y2=0, color=cmap(normalize(grad[i])))
yb3bgrhw

yb3bgrhw3#

我试图解决一个类似的问题,当我使用plt.imshow方法时,梯度是不正确的;我认为这是因为我的X轴不是均匀分布的,因为当我使用plt.fill_between时,它工作正常。
请给我解释一下如何改变plt.imhow正确地工作不均匀的X轴?因为它运行得更快,然后我可以添加一个颜色条的图表的边缘。

错误的梯度“等高线”图

im = plt.imshow(grad.reshape(1, y.size), cmap=plt.cm.jet, interpolation='bicubic',
                extent=[x[0], 41, (np.min(y)-(np.std(y)*0.5)), np.max(y)+20], aspect='auto',
                clip_path=patch, clip_on=True)
plt.colorbar()

正确的图表错误的实现

cmap = mpl.cm.jet
normalize = mpl.colors.Normalize(vmin=np.min(grad), vmax=np.max(grad))
for i in range(0,len(x)):
    plt.fill_between(x=x[i - 1:i + 1], y1=y[i - 1:i + 1], y2=0, color=cmap(normalize(grad[i])))

相关问题