Python& Matplotlib:如何绘制bootstrap直方图的范围?

时间:2016-07-25 02:33:02

标签: python numpy 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)

enter image description here

然而,这样的情节很难看到极限。是否可以绘制直方图的上限/下限,这样可以看得更清楚,也许像Boxplot这样的每个箱子?

http://matplotlib.org/_images/boxplot_demo_06.png

或只是具有上限/下限的曲线表示范围?

enter image description here

我的主要难点是提取每个bin的最大/最小值(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)

enter image description here

我发现这仍然很难看,有什么建议吗?

1 个答案:

答案 0 :(得分: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     将matplotlib.pyplot导入为plt     将pandas导入为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倍。 enter image description here