【问题标题】:Remove empty bars from grouped barplot从分组条形图中删除空条
【发布时间】:2017-09-20 08:04:46
【问题描述】:

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

我已经试过了:

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

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

【问题讨论】:

标签: python pandas matplotlib


【解决方案1】:

您的问题不完整。我不知道您要完成什么,但根据您所说的,我猜您正在尝试不显示空的数据透视对。

这在 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)

【讨论】:

  • 感谢您提供此示例。但我还是想摆脱他们。你现在有另一种删除它们的方法吗?我还编辑了我的代码。梅比有帮助
  • 您的代码不完整,因为我们不知道使用的任何数据。
猜你喜欢
  • 2018-09-29
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多