簡體   English   中英

如何用隨斜率變化的顏色填充折線圖?

[英]How to fill a line graph with a color that changes by slope?

我想做一個看起來像這樣的 plot(高程圖):

高程圖

在這里,他們繪制了海拔與距離的關系,圖表下方的區域由坡度着色(即,dElevation/dx)。 紅色有一個正斜率,綠色是平的,藍色是負斜率。

如果我有 x 和高程,則很容易計算斜率(dElevation/dx),但我很難用隨斜率變化的顏色填充圖形。

主要使用這種方法並對其進行一些調整使這成為可能:

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()

當然,如果需要,您可以選擇不同的顏色圖,但jet應該與您的示例圖片匹配。 請注意,如果海拔低於elevation_origin ,則需要修改此方法。 另請注意,這可以通過 web 搜索找到(至少大部分)。

我只是想分享上面答案的替代版本。

代替:

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]))) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM