Python и Matplotlib: как построить диапазон графика гистограммы начальной загрузки?

Я хочу привести пример дисперсии набора данных путем начальной загрузки (пересчета) данных.

from numpy.random import randn

fig,ax = plt.subplots()

bins = arange(-5,6,0.5)
df = pd.DataFrame(randn(3000))
df.hist(ax=ax, bins=bins, alpha = 0.7, normed=True)

count_collection = []
for i in xrange(1,100):
    temp_df = df.sample(frac=0.5, replace=True)
    temp_df.hist(ax=ax, bins=bins, alpha = 0.25, normed=True)

    count, division = np.histogram(temp_df, bins=bins) 
    count_collection.append(count)

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

Однако такому сюжету трудно увидеть предел. Можно ли построить верхний/нижний предел гистограммы, чтобы она была более четкой, может быть, что-то вроде Boxplot для каждого бина?


(источник: matplotlib.org )

или просто кривые с верхним/нижним пределом для указания диапазона?

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

Моя основная трудность заключается в извлечении максимального/минимального значения для каждой корзины (count_collection)

ОБНОВИТЬ:

Что было бы хорошим способом построить диапазон?

count_collection = np.array(count_collection)
mx = np.max(count_collection,0)
mn = np.min(count_collection,0)

ax.plot(division[1:]-0.25, mx, '_', mew=1)
ax.plot(division[1:]-0.25, mn, '_', mew=1)

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

Я считаю, что это все еще трудно смотреть, есть предложения?


person cqcn1991    schedule 25.07.2016    source источник
comment
Вы можете взглянуть на функцию numpy.histogram, который выполняет биннинг без построения графика. Вы можете использовать его, чтобы получить данные, а затем построить их так, как вам нравится.   -  person BrenBarn    schedule 25.07.2016
comment
@BrenBarn Я знаю np.histogram и использую его для сбора всех данных. Я просто не знаю, как получить максимальное/минимальное значение из коллекции значений.   -  person cqcn1991    schedule 25.07.2016
comment
Кстати, не должен ли count собирать temp_df? В противном случае кажется, что это всего лишь 100 повторений df...   -  person Aguy    schedule 25.07.2016
comment
@Агай, ты прав. Я допустил ошибку. Только что исправил.   -  person cqcn1991    schedule 25.07.2016


Ответы (1)


Чтобы извлечь максимум и минимум, вы можете использовать следующее:

count_collection = np.array(count_collection)
mx = np.max(count_collection,0)
mn = np.min(count_collection,0)

Первая строка просто меняется со списка массивов 1d на массив 2d, поэтому max и min могут работать.

изменить:

Поскольку исходный график был нормализован, трудно понять значение максимума и минимума половины размера выборки. Но вы можете сделать что-то вроде этого: импортировать numpy как np из numpy.random import randn import matplotlib.pyplot as plt import pandas as pd

fig,ax = plt.subplots()

bins = np.arange(-5,6,0.5)
df = pd.DataFrame(randn(3000))
#df.hist(ax=ax, bins=bins, alpha = 0.7, normed=True)
histval, _ = np.histogram(df, bins=bins)

count_collection = []
for i in np.arange(1,100):
    temp_df = df.sample(frac=0.5, replace=True)
#    temp_df.hist(ax=ax, bins=bins, alpha = 0.25, normed=True)

    count, division = np.histogram(temp_df, bins=bins)
    count_collection.append(count)

count_collection = np.array(count_collection)
mx = np.max(count_collection,0)
mn = np.min(count_collection,0)

plt.bar(bins[:-1], histval, 0.5)
plt.plot(bins[:-1] + 0.25, mx*2)
plt.plot(bins[:-1] + 0.25, mn*2)

2-кратный коэффициент связан с 2-кратным меньшим размером выборки при расчете максимального и минимального значений. введите здесь описание изображения

person Aguy    schedule 25.07.2016
comment
Есть ли какие-либо предложения по визуализации данных? Я обновляю рассматриваемый сюжет. Есть ли хороший способ построить диапазон? Я думаю, может быть, панель ошибок была бы хорошим выбором? - person cqcn1991; 25.07.2016
comment
Это сложно, так как вы использовали нормализацию. В образце ячейки обычно составляют половину высоты, если они нанесены в масштабе. Так что проблема не точно определена. Я добавил некоторый код, чтобы показать это. - person Aguy; 25.07.2016
comment
Концептуально, почему это трудно понять? Передискретизированные нормированные данные по-прежнему являются распределением. Предел — это просто предел, полученный из этого нормированного распределения. Я думаю, что это просто указывает на присущую случайную изменчивость распределения. - person cqcn1991; 25.07.2016
comment
Пока вы берете 2-кратный коэффициент, как в ответе выше, это может быть то, что вам нужно. - person Aguy; 25.07.2016