Управление цветами в графике

Вот макет DataFrame:

import pandas as pd
groups=pd.DataFrame({'Morph':np.random.choice(['S', 'Red'], 50),
                 'Tcross':np.random.rand(50)*0.2 ,  
                 'DeltaR12':np.random.rand(50)*2.0})

Я строю график рассеяния следующим образом:

import matplotlib.pyplot as plt

plt.rcParams.update(pd.tools.plotting.mpl_stylesheet)
colors = pd.tools.plotting._get_standard_colors(len(groups), color_type='random')

fig, ax = plt.subplots()
ax.set_color_cycle(colors)
ax.margins(0.05)
for name, group in groups:
    ax.plot(group.DeltaR12, group.Tcross, marker='o',
            linestyle='', ms=5, label=name)
legend = ax.legend(numpoints=1, loc='upper left', shadow=True)

# Hereafter, code for the subsidiary question at the end or the post
# code doesn't produce anything
frame = legend.get_frame()
frame.set_facecolor('0.90')

for label in legend.get_lines():
    label.set_linewidth(1.5)  



ax.set_xlabel('$\Delta R_{12}$')
ax.set_ylabel('$T_{cross}$')

В результате чего

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

Или, в качестве альтернативы, с магией морского волка в одну строку:

sns.swarmplot(x="DeltaR12", y="Tcross", data=groups, hue="MorphCen", size=6)

(какие группы с моим фактическим DataFrame даже не должны удалять другие столбцы)

В результате чего

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

Я хотел бы контролировать цвета категорий: выглядит глупо, если ярлык "Красный" нанесен на желтый или синий! Более того, спиральные галактики имеют синий цвет, поэтому чертить сиреневые категории на фиолетовом выглядит глупо. Как легко контролировать этот выбор цвета?

Дочерняя компания, если кто-то знает, как нарисовать рамку вокруг легенды, было бы неплохо, я не понимаю документ для автоматических меток, только для ручных.:) Я пробовал что-то в первом коде, как указано в комментариях, но он ничего не дает.

Спасибо

1 ответ

Решение

Итак, я понял, как это сделать. Во-первых, благодаря sgDysregulation (я не очень хорошо это реализовал, я уверен, что лучше это сделать ind вещь).

colour_lst=['r','b']

fig, ax = plt.subplots()
ax.set_color_cycle(colors)
ax.margins(0.05)
ind=0
for name, group in groups:
    ax.plot(group.DeltaR12, group.Tcross, marker='o',
            color = colour_lst[ind] ,linestyle='', ms=5, label=name)
    ind+=1  

ax.set_xlabel('$\Delta R_{12}$')
ax.set_ylabel('$T_{cross}$')

Во-вторых, более элегантно:

def transcocol(morph):
    if (morph == 'S'):
        return'b'
    else:
        return'r'
MLtargetColour = MLtarget.apply (lambda x: transcocol (x))
pl.scatter(group.DeltaR12, group.Tcross, c=MLtargetColour);

И последнее:

sns.swarmplot(x="DeltaR12", y="Tcross", 
              data=group, hue="MorphGal", palette="Set1",
              hue_order=['Red','S'], size=6)

Большое спасибо.

Другие вопросы по тегам