Как залить линейный график цветом, который меняется по наклону? - PullRequest
1 голос
/ 21 июня 2020

Я хотел бы построить график, похожий на этот (график высот):

График высот

Здесь они строят график зависимости высоты от расстояния, а область под графиком окрашена в зависимости от наклона (например, dElevation / dx). Красные имеют положительный наклон, зеленые плоские - i sh, а синие - отрицательные.

Если у меня есть x и высота, легко вычислить наклон (dElevation / dx), но я в тупике как заполнить график цветом, который меняется по наклону.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

В основном использование этого подхода и небольшая его корректировка делает это возможным:

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. Также обратите внимание, что это можно было найти (по крайней мере, большую часть) с помощью веб-поиска.

0 голосов
/ 21 июня 2020

Я просто хотел поделиться альтернативной версией ответа выше.

Вместо:

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]))) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...