2015-09-07 32 views
1

我有這個foll。數據幀:python中的重疊盒圖

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。我有這個foll。代碼(感謝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

由於您使用的熊貓已經,爲什麼不使用上dataframes箱線圖的方法?

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')