Как создать график плотности в matplotlib?
В R я могу создать желаемый результат, выполнив:
data = c(rep(1.5, 7), rep(2.5, 2), rep(3.5, 8),
rep(4.5, 3), rep(5.5, 1), rep(6.5, 8))
plot(density(data, bw=0.5))
![Density plot in R]()
В python (с matplotlib) ближайший я получил с простой гистограммой:
import matplotlib.pyplot as plt
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
plt.hist(data, bins=6)
plt.show()
![Histogram in matplotlib]()
Я также попробовал параметр normed = True, но не смог получить ничего, кроме попытки подогнать гауссову к гистограмме.
Мои последние попытки были вокруг scipy.stats
и gaussian_kde
, следуя примерам в Интернете, но пока я не увенчался успехом.
Ответы
Ответ 1
Свен показал, как использовать класс gaussian_kde
от Scipy, но вы заметите, что он не очень похож на то, что вы сгенерировали с помощью R. Это потому, что gaussian_kde
пытается автоматически определить пропускную способность. Вы можете поэкспериментировать с полосой пропускания, изменив функцию covariance_factor
класса gaussian_kde
. Во-первых, вот что вы получаете, не меняя эту функцию:
![alt text]()
Однако, если я использую следующий код:
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = gaussian_kde(data)
xs = np.linspace(0,8,200)
density.covariance_factor = lambda : .25
density._compute_covariance()
plt.plot(xs,density(xs))
plt.show()
я получаю
![alt text]()
что довольно близко к тому, что вы получаете от R. Что я сделал? gaussian_kde
использует изменяемую функцию, covariance_factor
, чтобы вычислить его пропускную способность. Перед изменением функции значение, возвращаемое covariance_factor для этих данных, составляло около .5. Понижение этого уменьшило пропускную способность. Я должен был вызвать _compute_covariance
после изменения этой функции, чтобы все факторы были рассчитаны правильно. Это не точное соответствие с параметром bw из R, но, надеюсь, это поможет вам в правильном направлении.
Ответ 2
Пять лет спустя, когда я Google "как создать график плотности ядра с использованием python", этот поток по-прежнему отображается вверху!
Сегодня гораздо более простой способ сделать это - использовать seaborn - пакет, который обеспечивает множество удобных функций построения и хорошего управления стилями.
import numpy as np
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.set_style('whitegrid')
sns.kdeplot(np.array(data), bw=0.5)
![введите описание изображения здесь]()
Ответ 3
Возможно, попробуйте что-то вроде:
import matplotlib.pyplot as plt
import numpy
from scipy import stats
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = stats.kde.gaussian_kde(data)
x = numpy.arange(0., 8, .1)
plt.plot(x, density(x))
plt.show()
Вы можете легко заменить gaussian_kde()
другой оценкой плотности ядра.
Ответ 4
Вариант 1:
Используйте график данных pandas
(построенный поверх matplotlib
):
import pandas as pd
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
pd.DataFrame(data).plot(kind='density') # or pd.Series()
![enter image description here]()
Вариант 2:
Используйте distplot
из seaborn
:
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.distplot(data, hist=False)
![enter image description here]()
Ответ 5
График плотности также можно создать с помощью matplotlib:
Функция plt.hist(data) возвращает значения y и x, необходимые для графика плотности (см. документацию https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.hist.html).
В результате следующий код создает график плотности с помощью библиотеки matplotlib:
import matplotlib.pyplot as plt
dat=[-1,2,1,4,-5,3,6,1,2,1,2,5,6,5,6,2,2,2]
a=plt.hist(dat,density=True)
plt.close()
plt.figure()
plt.plot(a[1][1:],a[0])
Этот код возвращает график плотности, как в ссылке: https://imgur.com/LiNIhLB