Почему легенда в matplotlib неправильно отображает цвета?

У меня есть график, на котором я показываю 3 разных линейных графика. Таким образом, я явно указываю легенду, чтобы отображать 3 цвета, по одному для каждого графика. Ниже приведен пример игрушки:

import matplotlib.pyplot as plt

for i in range(1,20):
    if i%3==0 and i%9!=0:
        plt.plot(range(1,20),[i+3 for i in range(1,20)], c='b')
    elif i%9==0:
        plt.plot(range(1,20),[i+9 for i in range(1,20)], c='r')
    else:
        plt.plot(range(1,20),range(1,20), c='g')
plt.legend(['Multiples of 3 only', 'Multiples of 9', 'All the rest'])
plt.show()

введите описание изображения здесь

Но в легенде неправильно отображаются цвета. Почему это так и как это исправить?


person Kristada673    schedule 29.07.2019    source источник
comment
Привет, проверьте это, а пока я также пытаюсь решить вашу проблема.   -  person Rex5    schedule 29.07.2019


Ответы (2)


Решено:

import matplotlib.pyplot as plt

my_labels = {"x1" : "Multiples of 3", "x2" : "Multiples of 9","x3":'All of the rest'}

for i in range(1,20):
    if i%3==0 and i%9!=0:
        plt.plot(range(1,20),[i+3 for i in range(1,20)], c='b', label = my_labels["x1"])
        my_labels["x1"] = "_nolegend_"
    elif i%9==0:
        plt.plot(range(1,20),[i+9 for i in range(1,20)], c='r', label = my_labels["x2"])
        my_labels["x2"] = "_nolegend_"
    else:
        plt.plot(range(1,20),[j for j in range(1,20)],c='g', label = my_labels["x3"])
        my_labels["x3"] = "_nolegend_"
plt.legend(loc="best") #
plt.show()

См. Ссылку doc в этой ссылке, чтобы помогите с объяснением ответа.

person Rex5    schedule 29.07.2019

Я попробовал ответить Rex5; в этом примере игрушки он работает, но в моем реальном сюжете (ниже) он по какой-то причине все еще порождает неверные легенды.

введите описание изображения здесь

Вместо этого, как предлагается в ссылке, предоставленной Rex5, работает следующее решение (как в игрушечном примере, так и в моем реальном сюжете ), да и проще:

for i in range(1,20):
    if i%3==0 and i%9!=0:
        a, = plt.plot(range(1,20),[i+3 for i in range(1,20)], c='b')
    elif i%9==0:
        b, = plt.plot(range(1,20),[i+9 for i in range(1,20)], c='r')
    else:
        c, = plt.plot(range(1,20),[j for j in range(1,20)],c='g')
plt.legend([a, b, c], ["Multiples of 3", "Multiples of 9", "All of the rest"])
plt.show()
person Kristada673    schedule 29.07.2019
comment
Я ответил за игрушечный пример, так как он только упоминался (а не на самом деле). И все же хорошо, что вы нашли свое решение! - person Rex5; 29.07.2019
comment
@ Rex5 Странно, почему ваше решение не работает с моими фактическими данными. - person Kristada673; 29.07.2019
comment
Вы добавили четвертую пару key:value в словарь и добавили предложение _nolegend_ в цикл for? - person Rex5; 29.07.2019