Количество записей легенды равно размеру набора данных - PullRequest
0 голосов
/ 28 сентября 2018

Я строю множество наборов данных в цикле for.Количество наборов и размер наборов не имеют проблем при построении.Когда я пытаюсь добавить легенду, все становится интереснее.Я получаю легенду, но я получаю только первый лейбл, который появляется сотни раз!У меня есть один набор данных с 887 точками, я получаю 887 записей легенды. Вот график, который я получаю

Вы можете получить доступ к файлам .py и .xlsx здесь: https://drive.google.com/drive/folders/1QCVw2yqIHexNCvgz4QQfJQDGYql1hGW8?usp=sharing

Вот код, который генерирует график.

# Temperature Data plotting 
=================================================
#initialize figure
plt.figure(figsize=(11,8))
Color = 'C'
Marks = '*','o','+','x','s','d','.'
nm = len(Marks)
q = 0 # Marks counter
c = 0 # color counter
for k in range(0,nt):
    style = 'C' + str(c) + Marks[q]
    test = 'T' + str(k)
    plt.plot([t+t_adjust[k]],[Temps[:,k]],style,label=test)
    #, label = 'test'
    c += 1
    if(c==6):
        c = 9
    if(c==10):
        c = 0
        q += 1
    if(k > nt-10):
        q = nm - 1
# Formatting Figure
#names = '1','2','3','4','5'
#name1 = '1'
#pylab.legend([name1])
#from collections import OrderedDict
#import matplotlib.pyplot as plt
#handles, labels = plt.gca().get_legend_handles_labels()
#by_label = OrderedDict(zip(labels, handles))
#plt.legend(by_label.values(), by_label.keys())      
plt.legend(loc = 'upper right')
plt.show()
# x axis limits, in seconds
plt.xlim(0,60)
plt.xlabel('t (s)')
plt.ylabel('T (deg C)')
FigTitle = (oper_name + '; ' + str(pres_val) + pres_unit + '; d=' +
    str(diam_val) + diam_unit + '; H=' + str(dist_val) + dist_unit)
plt.title(FigTitle)
# End Temperature Data Plotting     
==============================================

У меня есть 14 наборов данных с 887 точками каждый.Здесь явно более 14 легендарных записей.Не уверен, почему его так или иначе ссылаются на длину данных или что-то.Я нашел это (код ниже), чтобы найти маркеры и метки, но мне нужно, чтобы им было присвоено имя стиля для каждого набора данных вместо первого имени стиля для длины данных.

#from collections import OrderedDict
#import matplotlib.pyplot as plt
#handles, labels = plt.gca().get_legend_handles_labels()
#by_label = OrderedDict(zip(labels, handles))
#plt.legend(by_label.values(), by_label.keys())

1 Ответ

0 голосов
/ 28 сентября 2018

Трудно сказать, не взглянув на данные, но вы всегда можете контролировать, что входит в легенду, например так:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0., 2*np.pi, 101, endpoint=True)

lns = []
for i in range(1, 10):
    for j in range(10):
        ln = plt.plot(x, j*np.sin(x/i), label="series i={:d}".format(i))

    lns += ln # note plt.plot returns a list of entities

plt.legend(lns, [l.get_label() for l in lns], loc="best")
plt.show()
...