在python中重叠的boxplots

时间:2015-09-07 12:52:31

标签: python pandas boxplot

我有这个人。数据帧:

Av_Temp Tot_Precip
278.001 0
274     0.0751864
270.294 0.631634
271.526 0.229285
272.246 0.0652201
273     0.0840059
270.463 0.0602944
269.983 0.103563
268.774 0.0694555
269.529 0.010908
270.062 0.043915
271.982 0.0295718

并且想要绘制一个箱形图,其中x轴是' Av_Temp'分为等大小的区间(在这种情况下为2),Y轴显示Tot_Precip的相应值范围。我有这个人。代码(感谢Find pandas quartiles based on another column),但是,当我绘制箱图时,它们会被绘制成一个在另一个上面。有什么建议吗?

expl_var = 'Av_Temp'
cname = 'Tot_Precip'
df[expl_var+'_Deciles'] = pandas.qcut(df[expl_var], 2)
grp_df = df.groupby(expl_var+'_Deciles').apply(lambda x: numpy.array(x[cname]))

fig, ax = plt.subplots()
for i in range(len(grp_df)):
    box_arr = grp_df[i]
    box_arr = box_arr[~numpy.isnan(box_arr)]
    stats = cbook.boxplot_stats(box_arr, labels = str(i))

    ax.bxp(stats)
    ax.set_yscale('log')
plt.show()

enter image description here

1 个答案:

答案 0 :(得分:1)

既然您已经在使用pandas,为什么不在数据帧上使用boxplot方法呢?

expl_var = 'Av_Temp'
cname = 'Tot_Precip'
df[expl_var+'_Deciles'] = pandas.qcut(df[expl_var], 2)

ax = df.boxplot(by='Av_Temp_Deciles', column='Tot_Precip')
ax.set_yscale('log')

产生这个:http://i.stack.imgur.com/20KPx.png

如果您不喜欢这些标签,请输入

plt.xlabel('');plt.suptitle('');plt.title('')

如果你想要一个标准的盒子图,上面应该没问题。我对boxplot分离到boxplot_stats和bxp的理解是允许你修改或替换生成的统计数据并将其输入到绘图程序中。有关详细信息,请参阅https://github.com/matplotlib/matplotlib/pull/2643

如果您需要绘制具有非标准统计数据的箱线图,您可以在2D numpy阵列上使用boxplot_stats,因此您只需要调用一次。不需要循环。

expl_var = 'Av_Temp'
cname = 'Tot_Precip'
df[expl_var+'_Deciles'] = pandas.qcut(df[expl_var], 2)

# I moved your nan check into the df apply function
grp_df = df.groupby('Av_Temp_Deciles').apply(lambda x: numpy.array(x[cname][~numpy.isnan(x[cname])]))

# boxplot_stats can take a 2D numpy array of data, and a 1D array of labels
# stats is now a list of dictionaries of stats, one dictionary per quantile 
stats = cbook.boxplot_stats(grp_df.values, labels=grp_df.index)

# now it's a one-shot plot, no loops
fig, ax = plt.subplots()
ax.bxp(stats)
ax.set_yscale('log')