Отображение уникальных элементов легенды при построении сюжета из цикла - PullRequest
0 голосов
/ 04 марта 2019

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

Как сделать так, чтобы отображался только один элемент легенды, то есть только одна запись A и B?

Спасибо.

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({'code':['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
                     'd1':[1,2,3,4,5,1,2,3,4,5],
                     'd2':[2,3,4,5,6,2,3,4,5,6]})

f, ax = plt.subplots(1,1)
for lab, col in zip(['A', 'B'], ['red', 'green']):
    _ = data[data['code'] == lab]
    ax.plot((_['code'].values[0], _['code'].values[0]), (_['d1'], _['d2']),
            label = lab, color = col)
ax.legend()

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Альтернативное решение может выглядеть как

from collections import OrderedDict

# rest of the code

for lab, col in zip(['A', 'B'], ['red', 'green']):
    _ = data[data['code'] == lab]
    ax.plot((_['code'].values[0], _['code'].values[0]), (_['d1'], _['d2']),
            label = lab , color = col)
    i +=1 
ax.legend()

handles, labels = ax.get_legend_handles_labels()
unique = OrderedDict(zip(labels, handles))
ax.legend(unique.values(), unique.keys())

enter image description here

0 голосов
/ 04 марта 2019

Вы были почти там.Вы правильно извлекали значения x для построения графика, однако вы забыли сделать то же самое для значений y.Из-за этого вы создавали запись легенды для каждого значения y.

Вместо использования (_['d1'], _['d2']) при вызове ax.plot вы, вероятно, хотели что-то вроде (_['d1'].values.min(), _['d2'].values.max()):

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({'code':['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
                     'd1':[1,2,3,4,5,1,2,3,4,5],
                     'd2':[2,3,4,5,6,2,3,4,5,6]})

f, ax = plt.subplots(1,1)

for lab, col in zip(['A', 'B'], ['red', 'green']):
    _ = data[data['code'] == lab]
    ax.plot((_['code'].values[0], _['code'].values[0]), (_['d1'].values[0], _['d2'].values[-1]),
            label = lab, color = col)
ax.legend()

enter image description here

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