代码之家  ›  专栏  ›  技术社区  ›  Luis Ramon Ramirez Rodriguez

使用groupby后从pandas绘图中删除“None”文本

  •  1
  • Luis Ramon Ramirez Rodriguez  · 技术社区  · 6 年前

    d_data = {"Name":["Jean","Luis",   "Ana", "Ana",  "Jean",  "Luis","Ana",    "Ana",  "Luis","Ana","Luis" ],
              "Money":[100,   2220,       333,   3342,  4423,  43,   5454,     4455,    421,   996,3102],
              "Type":["Cash","Cash","Cash","Cash","Digital","Cash","Digital","Cash","Cash","Digital","Digital"]}
    

    我想为每个人的钱做一个条形图。 为此,我使用以下代码:

    df= pd.DataFrame(d_data)
    df.groupby(["Name","Type"]).sum().unstack().plot(kind='bar', stacked=True) 
    

    它产生了以下情节:

    enter image description here

    2 回复  |  直到 6 年前
        1
  •  1
  •   Sheldore    6 年前

    这是解决问题的一种方法。 ax.get_legend_handles_labels() 返回轴对象的图例句柄和标签。如果你打印 labels ,你会看到 None, Type

    现在,您可以剥离标签,只获取“现金”和“数字”,并使用列表理解功能将它们存储在 labels_new .

    plt.legend(handles, labels_new) ,您只能获得所需的图例。可能有其他直接的方法,但下面的解决方案也可以。

    fig, ax = plt.subplots()
    
    d_data = {"Name":["Jean","Luis",   "Ana", "Ana",  "Jean",  "Luis","Ana",    "Ana",  "Luis","Ana","Luis" ],
              "Money":[100,   2220,       333,   3342,  4423,  43,   5454,     4455,    421,   996,3102],
              "Type":["Cash","Cash","Cash","Cash","Digital","Cash","Digital","Cash","Cash","Digital","Digital"]}
    
    df= pd.DataFrame(d_data)
    df.groupby(["Name","Type"]).sum().unstack().plot(kind='bar', stacked=True, ax=ax) 
    
    handles, labels = ax.get_legend_handles_labels()
    labels_new = [label.strip('()').split(',')[1] for label in labels]
    plt.legend(handles, labels_new)
    

    enter image description here

        2
  •  1
  •   ImportanceOfBeingErnest    6 年前

    也许你想用 pivot_table groupby unstack . 这不会创建任何多索引,而且作为副作用,也不会产生奇怪的传说。

    import matplotlib.pyplot as plt
    import pandas as pd
    
    d_data = {"Name":["Jean","Luis",   "Ana", "Ana",  "Jean",  "Luis","Ana",    "Ana",  "Luis","Ana","Luis" ],
              "Money":[100,   2220,       333,   3342,  4423,  43,   5454,     4455,    421,   996,3102],
              "Type":["Cash","Cash","Cash","Cash","Digital","Cash","Digital","Cash","Cash","Digital","Digital"]}
    
    df= pd.DataFrame(d_data)
    
    pd.pivot_table(df, values="Money", index="Name", columns="Type", aggfunc="sum").plot(kind='bar', stacked=True) 
    
    plt.show()
    

    enter image description here