Есть ли способ затенения между двумя вертикальными функциями, которые никогда не соприкасаются в Matplotlib? - PullRequest
4 голосов
/ 10 января 2020

В настоящее время я восстанавливаю профиль температуры для проекта, который отображает высоту по оси Y и колебания температуры по оси X, как показано на рисунке:

The temperature profile with +/- 2-sigma error bounds

В центре графика есть толстая линия, которая представляет интерполированный / смоделированный профиль температуры. Справа и слева от интерполированного профиля находятся границы ошибок, в основном фактические данные со значением ошибки +/-. Я хотел бы выделить эти границы погрешностей, показывая, что интерполированный температурный профиль лежит в этих пределах.

Проблема, однако, в том, что они никогда не касаются, так что по существу они имеют разные значения x. Они также работают вертикально, поэтому оба параметра plt.fill_between и axvspan (которые образуют только прямоугольник) не работают. Я попытался изменить порядок некоторых аргументов, думая, потому что я строю график вертикально, это будет работать как:

plt1.plot(data, altitude, 'b') #Make the first plot show the temperature profile
plt1.plot(maxSigma, rawalt, 'r', linewidth = 0.3)
plt1.plot(minSigma, rawalt, 'g', linewidth = 0.3)
plt1.fill_between(rawalt, minSigma, maxSigma)

, но в ретроспективе это могло бы быть глупым выстрелом в темноте с моей стороны. Я в тупике.

1 Ответ

0 голосов
/ 12 января 2020

Чтобы развернуть комментарий на ImportanceOfBeingErnest , вот полный пример, показывающий использование matplotlib.pyplot.fill_betweenx,

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
fig = plt.figure(figsize=(6,8))

n = 200
x = [0.0]
xa = []
xe = []
# Generate some data with a random, accumulating jitter
for i in range(n-1):
    x.append((np.random.random()-0.5)+x[i-1])
ma = 10
# Add some variable error on each side of the generated data
# and use a running average to smooth the generated data
for i in range(n-ma):
    xa.append(sum(x[i:i+ma])/float(ma))
    xe.append([xa[i]-2+(np.random.random()-0.5)*0.25,xa[i]+2+(np.random.random()-0.5)*0.25])

y = np.linspace(10,0,n-ma)
xe = np.array(xe)
plt.plot(xa, y, lw=0.75)
plt.fill_betweenx(y, xe[:,0], xe[:,1], alpha=0.4)
plt.show()

enter image description here

...