Dictionary matplotlib栏从类别数据框列添加图例

Dictionary matplotlib栏从类别数据框列添加图例,dictionary,matplotlib,bar-chart,legend,Dictionary,Matplotlib,Bar Chart,Legend,我尝试添加图例,根据我的示例,该图例应输出: 有水果和水果两个字的红方块 带单词的绿色正方形 素食者 我尝试了几种方法(下面的例子只是众多试验中的一种),但我无法让它工作 有人能告诉我如何解决这个问题吗 import pandas as pd from matplotlib import pyplot as plt data = [['apple', 'fruit', 10], ['nanaba', 'fruit', 15], ['salat','veggie', 144]] data = p

我尝试添加图例,根据我的示例,该图例应输出:

  • 有水果和水果两个字的红方块
  • 带单词的绿色正方形 素食者
  • 我尝试了几种方法(下面的例子只是众多试验中的一种),但我无法让它工作

    有人能告诉我如何解决这个问题吗

    import pandas as pd
    from matplotlib import pyplot as plt
    data = [['apple', 'fruit', 10], ['nanaba', 'fruit', 15], ['salat','veggie', 144]] 
    data = pd.DataFrame(data, columns = ['Object', 'Type', 'Value']) 
    
    colors = {'fruit':'red', 'veggie':'green'}           
    c = data['Type'].apply(lambda x: colors[x])
    
    bars = plt.bar(data['Object'], data['Value'], color=c, label=colors)
    plt.legend()
    

    所以这是一个黑客解决方案,我相信可能有更好的方法来做到这一点。您可以使用原始打印颜色打印不可见的单个条形图,并指定标签。不过,您必须在子地块中执行此操作

    import pandas as pd
    from matplotlib import pyplot as plt
    
    data = [['apple', 'fruit', 10], ['nanaba', 'fruit', 15], ['salat','veggie', 144]] 
    data = pd.DataFrame(data, columns = ['Object', 'Type', 'Value']) 
    
    
    colors = {'fruit':'red', 'veggie':'green'}
    c = data['Type'].apply(lambda x: colors[x])
    
    
    ax = plt.subplot(111) #specify a subplot
    
    bars = ax.bar(data['Object'], data['Value'], color=c) #Plot data on subplot axis
    
    for i, j in colors.items(): #Loop over color dictionary
        ax.bar(data['Object'], data['Value'],width=0,color=j,label=i) #Plot invisible bar graph but have the legends specified
    
    ax.legend()
    
    plt.show()
    

    为不在轴上的对象创建图例的常用方法是创建代理艺术家,如图所示

    这里,


    你好,谢谢。它工作了,我现在就用你的解决方案。然而,我会让帖子打开,以防其他人建议另一个解决方案,正如你所说的,这是一个“黑客解决方案”。
    colors = {'fruit':'red', 'veggie':'green'}         
    labels = list(colors.keys())
    handles = [plt.Rectangle((0,0),1,1, color=colors[label]) for label in labels]
    plt.legend(handles, labels)