исправить легенду метки python - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь сделать такой же ярлык для «доменов» с одинаковыми номерами. как мне это сделать? Я хочу одного цвета для каждого номера домена ... please, see plot here

d = {'selected_peaks': [487, 537, 181, 139], 'timeStep': [24250000.0, 26750000.0, 9000000.0, 6900000.0]
   , 'F': [868.7655, 713.4191, 584.4315, 698.3004], 'domain': [2, 2, 3, 3]}

for i in range(len(d['selected_peaks'])):
    plt.plot(d['timeStep'][i], d['F'][i], 'o', label='domain '+str(d['domain'][i]))
    plt.legend()

Ответы [ 4 ]

3 голосов
/ 25 мая 2020

Просто создайте словарь цветов и укажите на них ссылку с помощью параметра color.

import matplotlib.pyplot as plt
d = {'selected_peaks': [487, 537, 181, 139], 'timeStep': [24250000.0, 26750000.0, 9000000.0, 6900000.0]
   , 'F': [868.7655, 713.4191, 584.4315, 698.3004], 'domain': [2, 2, 3, 3], }

colors = {2:'red', 3:'green'}

for i in range(len(d['selected_peaks'])):
    plt.plot(d['timeStep'][i], d['F'][i], 'o', label='domain '+str(d['domain'][i]), color=colors[d['domain'][i]])
    plt.legend()

enter image description here

1 голос
/ 25 мая 2020

Хотя график определенно можно создать только с использованием matplotlib, рассматриваемая задача очень подходит для представления данных в виде pandas фрейма данных и использования seaborn для построения.

Простая передача имени столбца «домен» в качестве параметра hue автоматически создает цвет для каждого домена и автоматически добавляет легенду с удалением всех двойных записей. Если вам не нравятся цвета по умолчанию, вы можете выбрать цветовую карту, создать цветовую карту или указать список цветов в качестве параметра palette. Также соответствующие метки для осей X и Y автоматически устанавливаются с использованием имен столбцов.

from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sns

d = {'selected_peaks': [487, 537, 181, 139], 'timeStep': [24250000.0, 26750000.0, 9000000.0, 6900000.0],
     'F': [868.7655, 713.4191, 584.4315, 698.3004], 'domain': [2, 2, 3, 3]}
df = pd.DataFrame(d)

sns.scatterplot('timeStep', 'F', marker='o', hue='domain', palette='tab10', data=df)

plt.show()

example plot

0 голосов
/ 25 мая 2020

Укажите цвет в зависимости от значения домена, используя переменную цвета, которая затем отправляется команде plt.plot ():

    if d["domain"][i] == 2:
        color = "b"
    elif d["domain"][i] == 3:
        color = "r"

И окончательный код становится:

import matplotlib.pyplot as plt

d = {
    "selected_peaks": [487, 537, 181, 139],
    "timeStep": [24250000.0, 26750000.0, 9000000.0, 6900000.0],
    "F": [868.7655, 713.4191, 584.4315, 698.3004],
    "domain": [2, 2, 3, 3],
}
for i in range(len(d["selected_peaks"])):
    if d["domain"][i] == 2:
        color = "b"
    elif d["domain"][i] == 3:
        color = "r"
    plt.plot(
        d["timeStep"][i],
        d["F"][i],
        "o",
        color=color,
        label="domain " + str(d["domain"][i]),
    )

    plt.legend()

enter image description here

0 голосов
/ 25 мая 2020

Разделение вашей проблемы на две части отвечает на ваш вопрос, но это выглядит не очень чисто ...

import matplotlib.pyplot as plt


d = {'selected_peaks': [487, 537, 181, 139],
     'timeStep': [24250000.0, 26750000.0, 9000000.0, 6900000.0],
     'F': [868.7655, 713.4191, 584.4315, 698.3004], 'domain': [2, 2, 3, 3]}


if 2 in d['domain']:
    for i in range(len(d['selected_peaks'][:2])):
        plt.plot(d['timeStep'][i], d['F'][i], 'o', c='black',
                 label='domain '+str(d['domain'][i]))
        plt.legend()
if 3 in d['domain']:
    for i in range(len(d['selected_peaks'][2:4])):
        plt.plot(d['timeStep'][i+2], d['F'][i+2], 'o', c='red',
                 label='domain '+str(d['domain'][i+2]))
        plt.legend()

enter image description here

...