распределение плотности и столбчатый график по данным x и y

#python #matplotlib #seaborn

Вопрос:

У меня есть следующий набор данных в фрейме данных pandas:

 x = df_data.iloc[:,0].values
y = df_data.iloc[:,1].values
 

Следующие данные указаны в x и y соответственно:

 x = 30, 31, 32, 33, 34, 35, 36
y = 1000, 2000, 3000, 4000, 3000, 2000, 1000
 

y представляет количество (как часто существует каждое значение x).

Теперь я хочу построить гистограмму с линией распределения плотности. Я открыт для использования seaborn или matplotlib, но не смог найти способ ввести данные x и y отдельно и получить гистограмму плюс график плотности.

Я пробовал это:

 x = [30,31,32,33,34,35,36]
y = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
##
sns.distplot(x, hist=True, kde=True,
    bins=int(150/150), color='darkblue',
    hist_kws={'edgecolor':'black'},
    kde_kws={'linewidth': 4})
plt.show()
 

но не получил того, чего хотел.

Я хотел бы иметь что-то вроде приведенного ниже (только для моих данных)

введите описание изображения здесь

(я получил это изображение от: https://towardsdatascience.com/histograms-and-density-plots-in-python-f6bda88f5ac0)

Ответ №1:

Во-первых, обратите внимание, что distplot в Сиборне 0,11 была обесценена. Расширенные и улучшенные версии теперь называются histplot (гистограмма с дополнительным kde ), kdeplot (только для kde) и displot (создает подзаголовки).

Необязательный weights= параметр задает веса для каждого из x значений. discrete=True необходимо иметь полосу для каждого x значения. cut Параметр kde определяет, насколько далеко кривая выводится за пределы точек данных.

 import matplotlib.pyplot as plt
import seaborn as sns

x = [30, 31, 32, 33, 34, 35, 36]
y = [1000, 2000, 3000, 4000, 3000, 2000, 1000]

sns.histplot(x=x, weights=y, discrete=True,
             color='darkblue', edgecolor='black',
             kde=True, kde_kws={'cut': 2}, line_kws={'linewidth': 4})
plt.show()
 

гистограмма с весами

Обратите внимание, что в случае, если базовые данные являются непрерывными, вы получите гораздо более корректный график, предоставив исходные данные.

Чтобы изменить цвет линии kde, очевидной идеей было бы использовать line_kws={'color': 'red'} , но это не работает в текущей версии seaborn (0.11.1).

Однако вы можете нарисовать histplot и kdeplot отдельно. Для того, чтобы иметь соответствующие оси y, histplot необходимо stat='density' (по умолчанию 'count' ).

 ax = sns.histplot(x=x, weights=y, discrete=True, alpha=0.5,
                  color='darkblue', edgecolor='black', stat='density')
sns.kdeplot(x=x, weights=y, color='crimson', cut=2, linewidth=4, ax=ax)
 

Другой подход заключается в последующем изменении цвета линии, который работает независимо от выбранного stat= .

 ax = sns.histplot(x=x, weights=y, discrete=True,
             color='darkblue', edgecolor='black',
             kde=True, kde_kws={'cut': 2}, line_kws={'linewidth': 4})
ax.lines[0].set_color('crimson')
 

sns.гистограмма с измененным цветом линии

Вот пример того, как гистограмма для одного набора данных может быть объединена с кривой kde другого набора данных:

 import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
import seaborn as sns

x = [30, 31, 32, 33, 34, 35, 36]
y = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
x2 = [20, 21, 22, 23, 24, 25, 26]
y2 = [1000, 2000, 3000, 4000, 3000, 2000, 1000]

ax = sns.histplot(x=x2, weights=y2, discrete=True, alpha=0.5,
                  color='darkblue', edgecolor='black', stat='density')
sns.kdeplot(x=x, weights=y, color='crimson', cut=2, linewidth=4, ax=ax)
ax.xaxis.set_major_locator(MultipleLocator(1))
plt.show()
 

объединение гистограммы с kdeplot другого набора данных

Комментарии:

1. здорово. есть ли возможность теперь изменить цвет синей линии на красный, но сохранить цвет гистограммы синим?

2. Спасибо! Последний вопрос: если бы я сейчас хотел построить эту красную линию для приведенных выше данных на рисунке без гистограммы, но вместо этого добавил бы гистограмму другого набора данных на рисунок, т. Е.: гистограмма для x2 = [20, 21, 22, 23, 24, 25, 26] и y2 = [1000, 2000, 3000, 4000, 3000, 2000, 1000], плюс красная линия для x = [30, 31, 32, 33, 34, 35, 36] у = [1000, 2000, 3000, 4000, 3000, 2000, 1000]. Возможно ли это?

3. Вам понадобится histplot без kde, но с stat='density' , а затем отдельно kdeplot . Обратите внимание, что без stat='density' гистограмм для обоих наборов данных масштаб был бы совсем другим.