заполнить общую область под обеими кривыми

avatar
BaRud
9 августа 2021 в 03:57
92
2
0

Как я могу заполнить общую область под обеими кривыми?

import matplotlib.pyplot as plt
import numpy as np
import scipy.special as sp

x = np.linspace(-4, 4, num=1000)
r = abs(x)

zeta = 1.0

psi_STO = (zeta**3 / np.pi)**(0.5) * np.exp(-zeta * r)
plt.figure(figsize=(4, 3))
plt.plot(x, psi_STO, color="C0")
plt.plot(x + 3, psi_STO, color="C0")
plt.show()

Если я использую:

plt.fill_betweenx(psi_STO, -1, 4, color="C1")

Я получаю график как:

enter image description here

Источник
Julien
9 августа 2021 в 04:01
0

под обоими = под min, так в чем проблема?

BaRud
9 августа 2021 в 04:04
0

не могли бы вы показать мне код?

Ответы (2)

avatar
mozway
9 августа 2021 в 04:24
1

Вы можете использовать fill_between. Поскольку ваши крестики не выровнены, вам нужно сначала произвести небольшие вычисления, чтобы найти общий диапазон. Это будет зависеть от количества точек в linspace. Здесь я вычислил это вручную: поскольку сдвиг равен 3, разница составляет 375 пунктов (250 на единицу).

import matplotlib.pyplot as plt
import numpy as np
import scipy.special as sp

x = np.linspace(-4, 4, num=1000)
r = abs(x)

zeta = 1.0

psi_STO = (zeta**3 / np.pi)**(0.5) * np.exp(-zeta * r)
plt.figure(figsize=(4, 3))
plt.plot(x, psi_STO, color="C0")
plt.plot(x + 3, psi_STO, color="C0")

x_common = (x+3)[:-375]
min_common = np.min([psi_STO[:-375], psi_STO[375:]], axis=0)
plt.plot(x_common, min_common, color='r')

plt.fill_between(x_common,min_common, color="#FFB0B0")
plt.show()

вывод: matplotlib fill_between

mozway
9 августа 2021 в 04:32
0

Проверьте ответ @Julien, чтобы узнать, как вычислить сдвиг, что мне лень делать;)

avatar
Julien
9 августа 2021 в 04:26
1

Это?

dx = 3 # x shift
di = int(dx/(x[1]-x[0])) # index shift
plt.fill_between(x[di:], np.minimum(psi_STO[:-di], psi_STO[di:]))