Python 数据框行名称为图例的matplotlib条形图

Python 数据框行名称为图例的matplotlib条形图,python,numpy,pandas,matplotlib,Python,Numpy,Pandas,Matplotlib,我正在尝试使用pandas dataframe的值设置条形图的图例。我搜索了一下,但找不到解决方案,我使用了SO的另一个片段来注释这些条。生成的绘图以我想要的不同颜色显示系列中的条形图,甚至带有条形图的值。例如,在Excel中,可以使用图例将系列值显示为图例。我正在尝试在这里获得该功能 这里有一个MWE: import pandas as pd import numpy as np import matplotlib.pyplot as plt from pylab import * impor

我正在尝试使用pandas dataframe的值设置条形图的图例。我搜索了一下,但找不到解决方案,我使用了SO的另一个片段来注释这些条。生成的绘图以我想要的不同颜色显示系列中的条形图,甚至带有条形图的值。例如,在Excel中,可以使用图例将系列值显示为图例。我正在尝试在这里获得该功能

这里有一个MWE:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
import seaborn, itertools
seaborn.set()

def flip(items, ncol):
    return itertools.chain(*[items[i::ncol] for i in range(ncol)])

def annotateBars(row, ax=ax):
    if row['A'] < 0.2:
        color = 'black'
        vertalign = 'bottom'
        vertpad = 0.02
    else:
        color = 'white'
        vertalign = 'top'
        vertpad = -0.02

    ax.text(row.name, row['A'] + vertpad, "{:.4f}%".format(row['A']),
            zorder=10, rotation=90, color=color,
            horizontalalignment='center',
            verticalalignment=vertalign,
            fontsize=14, weight='heavy')

labels1=["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
width = 0.75
my_colors = 'gbkymc'
arr1 = np.random.random((1, 5))
arr1_ind = np.arange((arr1.shape[1]))
df_arr1 = pd.DataFrame(zip(*arr1), index = arr1_ind, columns = ['A'])
ax = df_arr1.plot(kind='bar', width = 0.85, alpha = 0.5, color = my_colors)
# plt.xticks(arr1_ind+width/4, arr1_ind)

ax.set_xticks(arr1_ind)
ax.set_xticklabels([labels1[i] for i in arr1_ind])
hndls, lbls = ax.get_legend_handles_labels()
plt.legend(flip(hndls, 2), flip(labels1, 2), loc='best', ncol=2)

junk = df_arr1.apply(annotateBars, ax=ax, axis=1)
plt.tick_params(
    axis='x',          # changes apply to the x-axis
    which='both',      # both major and minor ticks are affected
    bottom='off',      # ticks along the bottom edge are off
    top='off',         # ticks along the top edge are off
    labelbottom='off') # labels along the bottom edge are off
plt.tight_layout()
plt.show()
将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从派拉布进口*
进口seaborn,itertools
seaborn.set()
def翻转(项目、ncol):
返回itertools.chain(*[items[i::ncol]表示范围内的i(ncol)])
def注释条(行,ax=ax):
如果行['A']<0.2:
颜色=‘黑色’
vertalign='底部'
vertpad=0.02
其他:
颜色=‘白色’
vertalign=‘顶部’
vertpad=-0.02
text(row.name,row['A']+vertpad,“{.4f}%.”格式(row['A']),
zorder=10,旋转=90,颜色=color,
水平对齐='中心',
垂直对齐=垂直对齐,
fontsize=14,重量=‘重’)
标签1=[“周一”、“周二”、“周三”、“周四”、“周五”、“周六”、“周日”]
宽度=0.75
我的颜色='gbkymc'
arr1=np.random.random((1,5))
arr1_ind=np.arange((arr1.shape[1]))
df_arr1=pd.DataFrame(zip(*arr1),index=arr1_ind,columns=['A']))
ax=df_arr1.绘图(种类='bar',宽度=0.85,alpha=0.5,颜色=my_颜色)
#plt.xticks(arr1_ind+宽度/4,arr1_ind)
ax.set_xticks(arr1_ind)
ax.set_xticklabel([labels1[i]表示arr1_ind中的i])
hndls,lbls=ax.get_legend_handles_labels()
plt.图例(翻转(hndls,2),翻转(标签1,2),loc='best',ncol=2)
垃圾=df_arr1.apply(注释条,ax=ax,ax=1)
plt.tick_参数(
axis='x',#更改适用于x轴
哪个class='tware',#主要和次要蜱虫都受到影响
bottom='off',#沿底边的勾号为off
top='off',#沿上边缘的勾号为off
labelbottom='off')#沿底部边缘的标签已关闭
plt.紧_布局()
plt.show()

听起来您希望图例每种颜色有一个项目

现在,您只需要创建一个艺术家(只需调用
bar
),因此图例将只有一个条目

作为一个简单的例子,你可以做一些与你想要的相似的事情:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({
        'value':np.random.random(5),
        'label':['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
        'color':['g', 'b', 'k', 'y', 'm']})

fig, ax = plt.subplots()

# Plot each bar separately and give it a label.
for index, row in df.iterrows():
    ax.bar([index], [row['value']], color=row['color'], label=row['label'],
           alpha=0.5, align='center')

ax.legend(loc='best', frameon=False)

# More reasonable limits for a vertical bar plot...
ax.margins(0.05)
ax.set_ylim(bottom=0)

# Styling similar to your example...
ax.patch.set_facecolor('0.9')
ax.grid(color='white', linestyle='-')
ax.set(axisbelow=True, xticklabels=[])

plt.show()