Перекрывающиеся гистограммы в Seaborn

Я строю две гистограммы, используя функцию histplot Сиборна. Первая гистограмма представляет весь мой набор данных, а вторая является подмножеством первого. Однако вторая гистограмма, похоже, не совпадает с первой, как ожидалось. Вот код, который я использую:

import numpy as np
from scipy.stats import norm

data = np.sin(np.arange(0, 6*np.pi, 0.1)) * 100
sns.scatterplot(x=[np.mean(data)], y=[0])
sns.lineplot(data)

population_size = 10000
sample_size = 100
total_means = []
for x in range(population_size):
    total_means.append(np.mean(np.random.choice(data, 100)))

total_means = np.array(total_means)
sns.histplot(total_means, kde=True)

# Q. Find the range for 68% of data will lie in that interval
from scipy.stats import norm
z1 = norm.ppf(.50 - .68/2)
se = np.array(data).std() / sample_size ** .5
x1 = z1 * se + np.array(data).mean()
z2 = norm.ppf(.50 + .68/2)
x2 = z2 * se + np.array(data).mean()
print(x1, x2)

plt.xticks(np.arange(total_means.min(), total_means.max(), 10))
plt.xticks(np.arange(0, 500, 100))
sns.histplot(total_means, kde=True)
sns.histplot(total_means[(total_means >= x1) & (total_means <= x2)], kde=True, color='r')

При переполнении стека рекомендуется избегать публикации полного кода. Однако у меня есть некоторые данные, которые можно использовать для быстрого решения проблемы без необходимости создания новых данных.

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

sns.histplot(total_means, kde=True)
sns.histplot(total_means[(total_means >= x1) & (total_means <= x2)], kde=True, color='r')

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не уверен, правильно ли я понял ваш вопрос. Но в предоставленном вами коде, похоже, есть перекрывающиеся графики. Просто были дополнительные вещи, которые делали его неразборчивым.

Вот то же самое после чистки. Пожалуйста, дайте мне знать, если вы это имели в виду.

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

data = np.sin(np.arange(0, 6 * np.pi, 0.1)) * 100

population_size = 10000
sample_size = 100
total_means = []
for x in range(population_size):
    total_means.append(np.mean(np.random.choice(data, 100)))

total_means = np.array(total_means)

# Q. Find the range for 68% of data will lie in that interval
z1 = norm.ppf(.50 - .68 / 2)
se = np.array(data).std() / sample_size ** .5
x1 = z1 * se + np.array(data).mean()
z2 = norm.ppf(.50 + .68 / 2)
x2 = z2 * se + np.array(data).mean()

plt.xticks(np.arange(total_means.min(), total_means.max(), 10))
sns.histplot(total_means, kde=True, color='g')
sns.histplot(total_means[(total_means >= x1) & (total_means <= x2)], kde=True, color='r')

Надеюсь это поможет.

вторая гистограмма должна находиться внутри первой гистограммы для значений x между x1 и x2, но, как вы можете видеть на графике, высоты гистограмм не совпадают.

user8234870 07.04.2024 13:37
Ответ принят как подходящий

Проблема в том, что для красного графика используются ячейки меньшего размера (по умолчанию рассчитывается с помощью np.histogram_bin_edges()). Меньшие ячейки означают, что каждая ячейка содержит меньше значений.

Вот код, показывающий разницу между использованием интервалов по умолчанию и использованием одних и тех же интервалов для обеих гистограмм. Первый и последний интервалы подмножества меньше, чем у большей гистограммы, поскольку края интервала не совпадают с пределами подмножества.

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

total_means = np.random.randn(2000)

fig, (ax1, ax2) = plt.subplots(ncols=2)

sns.histplot(total_means, kde=True, ax=ax1)
sns.histplot(total_means[(total_means >= -1) & (total_means <= 1)], kde=True, ax=ax1)
ax1.set_title('default bins')

bins = np.linspace(total_means.min(), total_means.max(), 30)
sns.histplot(total_means, bins=bins, kde=True, ax=ax2)
sns.histplot(total_means[(total_means >= -1) & (total_means <= 1)], bins=bins, kde=True, ax=ax2)
ax2.set_title('same bins for both')

plt.show()

Другие вопросы по теме