Как закрасить область под кривой - PullRequest
1 голос
/ 10 июля 2019

Я бы хотел затенить область под кривой. Это моя попытка:

from scipy.stats import lognorm
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.linspace(0,10,100)
plt.vlines(2, 0, lognorm.pdf(2,1), color='r', linestyles='solid')
plt.vlines(3, 0, lognorm.pdf(3,1), color='r', linestyles='solid')
plt.fill_between([2,3], [lognorm.pdf(2,1), lognorm.pdf(3,1)], color='red')
plt.plot(xpoints, lognorm.pdf(xpoints,1))

Однако это не затеняет под кривой.

enter image description here

Как вы делаете это правильно?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Использование where

Использование аргумента where для fill_between позволяет выбрать диапазон, в котором должно выполняться заполнение.

from scipy.stats import lognorm
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = lognorm.pdf(x, 1)

plt.vlines(2, 0, lognorm.pdf(2, 1), color='r', linestyles='solid')
plt.vlines(3, 0, lognorm.pdf(3, 1), color='r', linestyles='solid')

plt.fill_between(x, y, where=((x >= 2) & (x <= 3)), color='red')
plt.plot(x, y)

plt.show()

enter image description here

Проблема с этим может заключаться в том, что точка исходной кривой, которая находится ближе всего к выбранной границе, может все еще быть слишком далеко, так что могут возникнуть пропуски.

Стоит отметить, что если вы выберете точки достаточно плотные, или, если на то пошло, достаточно разумно, такие проблемы будут обойдены. То есть используя 101 балл, так что 2.0 и 3.0 фактически являются частью данных,

x = np.linspace(0, 10, 101)

даст красивую картинку:

enter image description here

Построение уточненного варианта кривой.

Следовательно, может иметь смысл пересмотреть вашу функцию на более плотной сетке и построить ее независимо.

from scipy.stats import lognorm
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = lognorm.pdf(x, 1)

plt.vlines(2, 0, lognorm.pdf(2, 1), color='r', linestyles='solid')
plt.vlines(3, 0, lognorm.pdf(3, 1), color='r', linestyles='solid')

xf = np.linspace(2, 3, 301)
yf = lognorm.pdf(xf, 1)
plt.fill_between(xf, yf, color='red')
plt.plot(x, y)

plt.show()

enter image description here

0 голосов
/ 10 июля 2019

Вы заполняете только на 2 очка, попробуйте это вместо:

plt.fill_between(xpoints[20:31], [lognorm.pdf(i,1) for i in xpoints[20:31]], color='red')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...