2017-01-17 7 views
2

Вот макет DataFrame:контролирования цвета в scaterplot

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}$') 

Итоговое в

enter image description here

или, альтернативно, с магией моря, в одной строке:

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

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

Результирующее в

enter image description here

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

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

Спасибо

+0

Вы заметили аргумент ключевого слова 'palette' для [' swarmplot'] (http://seaborn.pydata.org/generated/seaborn.swarmplot.html)? – Goyo

+0

@Goyo: Я пробовал следующий код, но он не создает то, что я хочу: 'sns.swarmplot (x =" DeltaR12 ", y =" Tcross ", data = Compact_SRed_Full_ML, hue =" MorphCen ", size = 6, palette = sns.palplot (sns.xkcd_palette (["blue", "red"]))) ' – Matt

+1

Интересно, что вы ожидаете, что' sns.palplot' вернется и почему. – Goyo

ответ

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) 

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