Как построить нормальное распределение по столбчатой диаграмме?
Сгруппированные данные:
Столбчатая диаграмма по этим данным:
Мой код:
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()
Надо поверх столбчатой диаграммы показать нормальное распределение:
Пробовал код построения двух графиков на одном листе, безуспешно:
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()