从分组的条形图中删除空条

时间:2017-09-20 08:04:47

标签: python pandas matplotlib

我有一个分组的条形图。它工作得很好,但我试图删除空的条形图。他们占用太多空间。

我已经尝试过了:

%matplotlib inline
import matplotlib as mpl
from matplotlib.gridspec import GridSpec
import matplotlib.pyplot as plt
import sys
import os
import glob
import seaborn as sns
import pandas as pd
import ggplot
from ggplot import aes

sns.set(style= "whitegrid", palette="pastel", color_codes=True )

tab_folder = 'myData'
out_folder ='myData/plots'
tab = glob.glob('%s/R*.tab'%(tab_folder))

#is reading all my data
for i, tab_file in enumerate(tab):
    folder,file_name=os.path.split(tab_file)
    s_id=file_name[:-4].replace('DD','')
    df=pd.DataFrame.from_csv(tab_file, sep='\t')

    df_2 = df.groupby(['name','ab']).size().reset_index(name='count')

    df_2 = df_2[df_2['count'] != 0]

    table = pd.pivot_table(df_2, index='name',columns='ab', values='count' ) 
    table.plot(kind='barh', width = 0.9, color = ['b', 'g', 'r'], ax = ax)

    for label in (ax.get_xticklabels() + ax.get_yticklabels()):

        label.set_fontsize(4)


    ax.set_title(s_id).update({'color':'black', 'size':5, 'family':'monospace'})
    ax.set_xlabel('')
    ax.set_ylabel('')

    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles[::-1], labels[::-1], bbox_to_anchor=(1, 1.05),prop= {'size': 4} )

png_t = '%s/%s.b.png'%(out_folder,s_id)
plt.savefig(png_t, dpi = 500)

但它没有用。酒吧仍然是一样的。 还有其他方法可以删除空条吗?

1 个答案:

答案 0 :(得分:0)

您的问题尚不完整。我不知道你想要完成什么,但从你所说的我猜你不会想要显示空的枢轴对。

大熊猫的标准手段无法做到这一点。组的情节需要显示所有这些,甚至NaNs,其将绘制为“空条”

此外,groupby每个群组的大小至少为1,因此df_2[df_2['count'] != 0]总是如此。

例如

df = pd.DataFrame([['nameA', 'abA'], ['nameB', 'abA'],['nameA','abB'],['nameD', 'abD']], columns=['names', 'ab'])
df_2 = df.groupby(['names', 'ab']).size().reset_index(name='count')
df_2 = df_2[df_2['count'] != 0] # this line has no effect
table = pd.pivot_table(df_2, index='names',columns='ab', values='count' ) 
table

给出

ab      abA     abB     abD
names           
nameA   1.00    1.00    NaN
nameB   1.00    NaN     NaN
nameD   NaN     NaN     1.00

table.plot(kind='barh', width = 0.9, color = ['b', 'g', 'r'])

显示

enter image description here

就是这样。 Plot需要在透视后显示所有组。

修改

您还可以使用堆积图来摆脱空间

table.plot(kind='barh', width = 0.9, color = ['b', 'g', 'r'], stacked=True)

stacked