создать легенду вручную в matplotlib - PullRequest
0 голосов
/ 13 июня 2018

У меня есть следующий код для построения гистограммы - есть 6 видов, но код группирует их в три цветных группировки.

Затем я хочу сделать легенду о трех группах с тремя цветами.Тем не менее, легенда содержит только первую группу (которая окрашена правильно!), А затем игнорирует другие группировки (см. Изображение)

enter image description here

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

#create data frame
G = pd.DataFrame(np.random.normal(100,20,size=(30, 1)), columns=list('G'))
T = []
for i in range(1,7):
    for j in range(5):
        T.append('Species'+repr(i))
T = pd.DataFrame(np.array(T).reshape(30,1), columns = list("T"))
cols = ['g','b','k']
C=[]
for i in range(3):
    for j in range(10):
        C.append(cols[i])
C = pd.DataFrame(np.array(C).reshape(30,1), columns = list("C"))
dat = pd.concat([G, C, T], axis = 1)
dat.columns = ['growth', 'cols', 'sp']

#begin code to make plot
grps = sorted(list(set(list(dat['sp']))))
meanGrs=[]
sems=[]
cols=[]
y_pos = np.arange(len(grps))
for grp in grps:
    qw = 'sp == "' + grp + '"'
    meanGrs.append(dat.query(qw)['growth'].mean())
    sems.append(dat.query(qw)['growth'].sem())
    cols.append(str(dat.query(qw)['cols'].max()))

plt.bar(y_pos, meanGrs, yerr=sems, align = 'center', alpha = 0.5, color = cols, label = cols)
plt.legend(('group 1', 'group 2', 'group 3'))
plt.xticks(y_pos, grps, ha = 'right', rotation = 45)
plt.show()

Любая помощь высоко ценится

Ответы [ 4 ]

0 голосов
/ 14 июня 2018

Я не совсем уверен, что определит, к какой группе относится в этом случае.Но если это произвольно, вы можете просто создавать группы на лету.

legenditems = [(plt.Rectangle((0,0),1,1, color=c, alpha=0.5), "group "+str(i+1))
                 for i,c in enumerate(np.unique(cols))]
plt.legend(*zip(*legenditems))

enter image description here

0 голосов
/ 13 июня 2018

Вы можете попробовать так:

for _ in dat['sp']: #looping here keeps the order
if _ not in grps:
    grps.append(_)

i=0
for grp in grps:
    dat.loc[dat['sp']==grp,'meanGrs']= dat.loc[dat['sp']==grp,'growth'].mean()
    dat.loc[dat['sp']==grp,'sems']= dat.loc[dat['sp']==grp,'growth'].sem()
    plt.bar(i, dat.loc[dat['sp']==grp,'meanGrs'], 
              yerr=dat.loc[dat['sp']==grp,'sems'], align = 'center', 
              alpha = 0.5, color = dat.loc[dat['sp']==grp,'cols'])
    i=i+1
    plt.legend(('group 1', 'group 2', 'group 3', 'group 4'))
    plt.show()
0 голосов
/ 14 июня 2018

Это делает работу:

import matplotlib.patches as mpatches

l1 = mpatches.Patch(color='k', label='group 1')
l2 = mpatches.Patch(color='b', label='group 2')
l3 = mpatches.Patch(color='g', label='group 3')
plt.legend(handles=[l1, l2, l3)
0 голосов
/ 13 июня 2018

Поместите аргумент "label" в plt.bar:

plt.bar(y_pos, meanGrs, yerr=sems, align = 'center', alpha = 0.5, color = cols, label=cols)
...