Управление цветами в графике
Вот макет 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)
Большое спасибо.