Python 'для' l oop сюжетная легенда с одинаковыми именами и цветом - PullRequest
0 голосов
/ 24 марта 2020

У меня есть простой фрейм данных с названием группы, х и у данных. Каждая строка имеет уникальное имя группы, но повторяется. Мой код указан ниже:

from colour import Color
clr_list = list(mcd.XKCD_COLORS.values())[::10][:len(strng_list)] # unique color list
ex = [['group1',[1,2,3,4],[1,2,3,4]],['group2',[1,2,3,4],[3,2,1,6]],
      ['group1',[1,2,3,4],[3,9,6,5]],['group2',[1,2,3,4],[4,6,9,0]]]
exdf = pd.DataFrame(columns=['name','xdata','ydata'],data=ex)
print(exdf)
#     name         xdata         ydata
#0  group1  [1, 2, 3, 4]  [1, 2, 3, 4]
#1  group2  [1, 2, 3, 4]  [3, 2, 1, 6]
#2  group1  [1, 2, 3, 4]  [3, 9, 6, 5]
#3  group2  [1, 2, 3, 4]  [4, 6, 9, 0]

name_list = exdf['name'].unique().tolist()
for i in name_list: 
    auxdf = exdf[exdf['name']== i]
    auxdf.reset_index(drop=True,inplace=True)
    idx = name_list.index(i)
    for ses in range(0,len(auxdf)):
        plt.plot(auxdf['xdata'][ses],auxdf['ydata'][ses],
                 '-',color=clr_list[idx],label =auxdf['name'][ses])
plt.ylabel("ydata")
plt.legend(loc='center left',fontsize = 8,ncol=2)
plt.xlabel("xdata")
plt.subplots_adjust(left=0.14, right=0.67, top=0.95, bottom=0.15)
plt.show()

Мой текущий вывод приведен ниже:

enter image description here

Надеюсь, вы поняли проблему из легенда картины. Да! Я хочу создать легенду без повторяющихся имен и цветов. Как этого избежать.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Вы можете указать, чтобы добавить метку только в первый раз:

from colour import Color
import matplotlib._color_data as mcd
import pandas as pd
import matplotlib.pyplot as plt

clr_list = list(mcd.XKCD_COLORS.values())[::10][:2] # unique color list
ex = [['group1',[1,2,3,4],[1,2,3,4]],['group2',[1,2,3,4],[3,2,1,6]],
      ['group1',[1,2,3,4],[3,9,6,5]],['group2',[1,2,3,4],[4,6,9,0]]]
exdf = pd.DataFrame(columns=['name','xdata','ydata'],data=ex)
print(exdf)
#     name         xdata         ydata
#0  group1  [1, 2, 3, 4]  [1, 2, 3, 4]
#1  group2  [1, 2, 3, 4]  [3, 2, 1, 6]
#2  group1  [1, 2, 3, 4]  [3, 9, 6, 5]
#3  group2  [1, 2, 3, 4]  [4, 6, 9, 0]

name_list = exdf['name'].unique().tolist()
for i in name_list: 
    auxdf = exdf[exdf['name']== i]
    auxdf.reset_index(drop=True,inplace=True)
    idx = name_list.index(i)
    for ses in range(0,len(auxdf)):
        plt.plot(auxdf['xdata'][ses],auxdf['ydata'][ses],
                 '-',color=clr_list[idx],label =auxdf['name'][ses] if ses == 0 else "")
plt.ylabel("ydata")
plt.legend(loc='center left',fontsize = 8,ncol=2)
plt.xlabel("xdata")
plt.subplots_adjust(left=0.14, right=0.67, top=0.95, bottom=0.15)
plt.show()

добавление label =auxdf['name'][ses] if ses == 0 else "" добьется цели

0 голосов
/ 24 марта 2020

Вдохновленный ответом здесь

следующий ответ:

ex = [['group1',[1,2,3,4],[1,2,3,4]],['group2',[1,2,3,4],[3,2,1,6]],
      ['group1',[1,2,3,4],[3,9,6,5]],['group2',[1,2,3,4],[4,6,9,0]]]
exdf = pd.DataFrame(columns=['name','xdata','ydata'],data=ex)
name_list = exdf['name'].unique().tolist()
for i in name_list: 
    auxdf = exdf[exdf['name']== i]
    auxdf.reset_index(drop=True,inplace=True)
    idx = name_list.index(i)
    for ses in range(0,len(auxdf)):
        plt.plot(auxdf['xdata'][ses],auxdf['ydata'][ses],
                 '-',color=clr_list[idx],label =auxdf['name'][ses])
plt.ylabel("ydata")
handles, labels = plt.gca().get_legend_handles_labels()
by_label = dict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys())
plt.xlabel("xdata")
plt.subplots_adjust(left=0.14, right=0.97, top=0.95, bottom=0.15)
plt.show()

Текущий вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...