Как построить нормальное распределение по столбчатой диаграмме?

Сгруппированные данные:

Таблица 1.
Таблица 1

Столбчатая диаграмма по этим данным:

Рисунок 1.
Рисунок 1

Мой код:

import pandas as pd
import matplotlib.pyplot as plt

cut_df4_Q1 = pd.DataFrame({
    'Q1': ["18441 - 19947", "19947 - 21444", "21444 - 22942", "22942 - 24439", "24439 - 25936", "25936 - 27433"],
    'частота': [4, 3, 8, 9, 4, 3],
    'частность': [12.9, 9.68, 25.81, 29.03, 12.9, 9.68]
})

plt.axes([0,0,2.1,1.1])
plt.rcParams.update({'font.size': 16})
plt.bar(cut_df4_Q1.Q1, cut_df4_Q1['частность'],  edgecolor = 'Black', width = 1, color = 'aliceblue')
plt.xlabel('Q1, т') # подпись оси x
plt.ylabel('Частость, %', fontsize = 16) # подпись оси y
plt.show()

Надо поверх столбчатой диаграммы показать нормальное распределение:

Рисунок 2. Рисунок 2

Пробовал код построения двух графиков на одном листе, безуспешно:

plt.figure(figsize=(25, 5))
bins = [18441, 19947, 21444, 22942, 24439, 25936, 27433]
df_2 = df_2.dropna()
ax = sns.displot(x = df_2['Q1'], data= df_2,  bins = bins,  height=5, 
aspect=1.5,stat='percent')
plt.xticks(bins)

xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
plt.plot(x, p, 'k', linewidth=2)
plt.show()

Датафрейм df_2 - это исходные данные, из которых получен датафрейм, представленный в таблице 1.

Помогите написать код для построения одновременно и столбчатой диаграммы, и нормального распределения.


Ответы (2 шт):

Автор решения: Fox Fox

Это не ответ! Это пример такой диаграммы:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm

# Генерация случайных данных
data = np.random.normal(loc=0, scale=1, size=1000)

# Построение столбчатой диаграммы
sns.histplot(data, bins=30, kde=False, stat='density', color='skyblue', edgecolor='black')

# Параметры нормального распределения
mu, std = norm.fit(data)

# Генерация значений для кривой нормального распределения
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)

# Построение кривой нормального распределения
plt.plot(x, p, 'k', linewidth=2)
plt.xlabel('Значение')
plt.ylabel('Плотность')
plt.title('Столбчатая диаграмма с наложенной кривой нормального распределения')
plt.show()
→ Ссылка
Автор решения: gord1402

Считаем параметры и отображаем распределение, в общем-то ответ на вопрос уже есть не понимаю, чего автору не хватает.

import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

data = {
    "Q1": ["18441 - 19947", "19947 - 21444", "21444 - 22942", "22942 - 24439", "24439 - 25936", "25936 - 27433"],
    "частота": [4, 3, 8, 9, 4, 3],
    "частость": [12.9, 9.68, 25.81, 29.03, 12.9, 9.68]
}

df = pd.DataFrame(data)

df["Midpoint"] = df["Q1"].apply(lambda x: np.mean([int(i) for i in x.split(" - ")]))

mu, sigma = np.mean(df["Midpoint"]), np.std(df["Midpoint"])

x_values = np.linspace(min(df["Midpoint"]), max(df["Midpoint"]), 100)
y_values = stats.norm.pdf(x_values, mu, sigma)

y_values = y_values * max(df["частость"]) / max(y_values)

sns.set_theme(style="whitegrid")

plt.rcParams.update({'font.size': 16})
plt.figure(figsize=(10, 5))

plt.bar(df["Midpoint"], df["частость"], width=1000, color="skyblue", edgecolor="black")

plt.plot(x_values, y_values, color="red", linewidth=2, label="Normal Distribution")

plt.xlabel('Q1, т')
plt.ylabel('Частость, %', fontsize = 16)
plt.xticks(df["Midpoint"], df["Q1"])
plt.legend()

plt.show()

результат

→ Ссылка