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

nwo49xxi  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(230)

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

%matplotlib inline
import os
import glob

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

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.update({'color': 'black', 'size': 5, 'family': 'monospace'})
    ax.set(xlabel='', ylabel='', title=s_id)

    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)

但没有用。酒吧还是一样的。是否有其他方法来删除空条?

k5ifujac

k5ifujac1#

你的问题不完整。我不知道你想实现什么,但从你所说的,我猜你是试图不显示空的枢纽对。
这是不可能的标准手段的Pandas。组的图需要显示所有组,即使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'])

显示

事情就是这样图需要显示枢轴后的所有组。

    • 编辑**

您也可以使用堆叠图,以摆脱空间

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

相关问题