Как создать график плотности в matplotlib? - PullRequest
108 голосов
/ 11 ноября 2010

В 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, следуя примерам в Интернете, но я пока не увенчался успехом.

Ответы [ 4 ]

122 голосов
/ 27 сентября 2015

Пять лет спустя, когда я 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)

enter image description here

114 голосов
/ 11 ноября 2010

Свен показал, как использовать класс 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, но, надеюсь, оно поможет вам в правильном направлении.

44 голосов
/ 11 ноября 2010

Может быть попробовать что-то вроде:

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() другой оценкой плотности ядра.

37 голосов
/ 02 ноября 2015

Опция 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...