2016-05-27 5 views
1

у меня есть этот панд DataFrame:Seaborn категоричен участок с оттенком от DataFrame строк

>>> print(df) 
Channel  0  1  2  3  4  5  6  7 
Sample             
7d  3.82 4.10 3.86 3.86 3.95 3.65 3.43 3.63 
12d  2.97 4.32 3.50 3.58 3.22 3.37 3.58 3.78 
17d  4.01 4.04 4.10 3.43 3.76 3.26 3.35 3.48 
DO  3.07 3.58 3.14 3.22 3.11 3.09 3.16 3.16 

я хочу сделать сюжет, похожий на этот (код sns.swarmplot(df)):

enter image description here

Но цвета должны быть установлены не для каждого канала (например, для столбца DataFrame), а для каждого образца (например, строки DataFrame). Поэтому каждая «категория» на оси х будет иметь 4 цвета, соответствующие строкам 7d, 12d, 17d и DO.

Есть ли простой способ сделать это в морском море?

EDIT: Я хотел бы добавить, что я попытался с помощью ключевого слова hue, но он говорит, что требует использование также x и y ключевого слова. Согласно this example кажется, что мне нужно создать новый DataFrame со всеми численными значениями в одном столбце и двумя другими столбцами с информацией о семпла и канале. Затем я могу назвать сюжет как sns.swarmplot(x='Channel', y='values', hue='Sample'). Есть ли более прямой способ, который не связан с созданием дополнительного ad-hoc DataFrame?

EDIT2: После @BrenBarn предложение, я в конечном итоге создание нового "кругленькую" DataFrame с:

dd = [] 
for sa in df.index: 
    print(sa) 
    d = pd.DataFrame(df.loc[sa]).reset_index() 
    d.columns = ['Channel', 'Leakage'] 
    d['Sample'] = sa 
    dd.append(d) 
ddf = pd.concat(dd) 

А потом черчения данные с:

sns.swarmplot(x='Channel', y='Leakage', hue='Sample', data=ddf) 

который дает сюжет Я ожидал:

enter image description here

Я надеялся, что существует сказать, чтобы использовать оригинальный формат «2-D table», чтобы сделать график , который является гораздо более компактным и естественным для данных такого типа. Если это возможно, я бы принял ответ;).

+0

Почему бы не перенести ваши данные? Затем вы можете сделать столбец «Channel» и установить его как переменную X. – BrenBarn

+0

Можете ли вы рассказать о том, как создать колонку «Channel» и задать ее как переменную X? – user2304916

+0

Ваше правление подсказывает вам, как это сделать. В общем, чтобы эффективно использовать морские участки, вам нужны ваши данные в «аккуратном» формате, где каждая строка представляет собой одно наблюдение. Вы должны попытаться получить данные в этом формате. Вместо того, чтобы думать об этом как о «дополнительном ad hoc DataFrame», вам следует подумать о том, чтобы сделать этот формат вашим основным, универсальным форматом. – BrenBarn

ответ

2

Вы в основном ответили на свой вопрос в редактировании, но вы можете посмотреть на pd.melt или pd.stack как простой способ создания нового кругленькую DataFrame.

например.

s=df.stack() 
s.name='values' 
df_tidy=s.reset_index() 
sns.stripplot(data=df_tidy,hue='sample',x='Channel',y='values') 

или

df_tidy=pd.melt(df.reset_index(),id_vars=['sample'],value_vars=df.columns.tolist(),value_name='values') 
sns.stripplot(data=df_tidy,hue='sample',x='Channel',y='values') 
+0

Интересно, я не знал об этих функциях! С вашим намеком я нашел еще более простой способ: 'pd.melt (df.T.reset_index(), id_vars = 'Channel') ' – user2304916

+1

Кроме того, альтернатива без морщин:' df.T.plot (marker = 'o', ls = 'None') '(по крайней мере, хорошо работает для этого примера, I не знаю, насколько сложна ваша фактическая база данных). –

+0

Ничего себе, ваши права! Однако я теряю функцию «рой». – user2304916