Нарисуйте две гистограммы на одном графике, и их столбцы суммируют до 100

У меня есть два набора разных размеров, которые я хотел бы нарисовать на одной гистограмме. Однако, поскольку один набор имеет ~330 000 значений, а другой - около ~16 000 значений, их частотные гистограммы трудно сравнивать. Я хотел бы построить гистограмму, сравнивая эти два набора так, что ось Y является% вхождений в этом контейнере. Мой код ниже приближается к этому, за исключением того, что вместо того, чтобы отдельные значения бина суммировались с 1,0, интеграл гистограммы суммируется с 1,0 (это из-за параметра normed=True).

Как я могу достичь своей цели? Я уже пытался вручную вычислить процентную частоту и использовать plt.bar(), но вместо наложения графиков графики сравниваются бок о бок. Я хочу сохранить эффект наличия альфа =0,5

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

if plt.get_fignums():
    plt.close('all')

electric = pd.read_csv('electric.tsv', sep='\t')
gas = pd.read_csv('gas.tsv', sep='\t')

electric_df = pd.DataFrame(electric)
gas_df = pd.DataFrame(ngma_nonheat)

electric = electric_df['avg_daily']*30
gas = gas_df['avg_daily']*30


## Create a plot for NGMA gas usage
plt.figure("Usage Comparison")

weights_electric = np.ones_like(electric)/float(len(electric))
weights_gas = np.ones_like(gas)/float(len(gas))

bins=np.linspace(0, 200, num=50)

n, bins, rectangles = plt.hist(electric, bins, alpha=0.5, label='electric usage', normed=True, weights=weights_electric)
plt.hist(gas, bins, alpha=0.5, label='gas usage', normed=True, weights=weights_gas)

plt.legend(loc='upper right')
plt.xlabel('Average 30 day use in therms')
plt.ylabel('% of customers')
plt.title('NGMA Customer Usage Comparison')
plt.show()

1 ответ

Решение

Похоже, вы не хотите normed/density kwarg в этом случае. Вы уже используете weights, Если вы умножите свой вес на 100 и пропустите normed=True вариант, вы должны получить именно то, что вы имели в виду.

Например:

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)

x = np.random.normal(5, 2, 10000)
y = np.random.normal(2, 1, 3000000)

xweights = 100 * np.ones_like(x) / x.size
yweights = 100 * np.ones_like(y) / y.size

fig, ax = plt.subplots()
ax.hist(x, weights=xweights, color='lightblue', alpha=0.5)
ax.hist(y, weights=yweights, color='salmon', alpha=0.5)

ax.set(title='Histogram Comparison', ylabel='% of Dataset in Bin')
ax.margins(0.05)
ax.set_ylim(bottom=0)
plt.show()

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

С другой стороны, что ты сейчас делаешь (weights а также normed) приведет к (обратите внимание на единицы на оси Y):

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)

x = np.random.normal(5, 2, 10000)
y = np.random.normal(2, 1, 3000000)

xweights = 100 * np.ones_like(x) / x.size
yweights = 100 * np.ones_like(y) / y.size

fig, ax = plt.subplots()
ax.hist(x, weights=xweights, color='lightblue', alpha=0.5, normed=True)
ax.hist(y, weights=yweights, color='salmon', alpha=0.5, normed=True)

ax.set(title='Histogram Comparison', ylabel='% of Dataset in Bin')
ax.margins(0.05)
ax.set_ylim(bottom=0)
plt.show()

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

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