matplotlib 条形图从类别数据框列添加图例

S12*_*000 11 dictionary matplotlib legend bar-chart

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

  1. 一个红色方块,上面写着水果和
  2. 一个带有素食一词的绿色方块。

我尝试了几件事(下面的例子只是众多试验中的一项),但我无法让它工作。

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

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()
Run Code Online (Sandbox Code Playgroud)

阴谋

Imp*_*est 22

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

这里,

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Ben*_*enT 2

所以这是一个 hacky 解决方案,我确信可能有更好的方法来做到这一点。您可以做的是使用width=0原始绘图颜色绘制不可见的单个条形图并指定标签。不过,您必须在子图中执行此操作。

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述