2016-07-06 3 views
2

У меня есть кадр панды данных, содержащий категорические данные, выглядит следующим образом:Seaborn stripplot и errorbars

 cat  DM3_r DM3_r_err 
133 stuff 9.908949 0.442363 
1347 foo 1.156828 0.130174 
132 bar 0.818709 0.593341 
1350 stack 0.798348 0.089866 
977 over 0.724274 0.462868 
1054 flow 0.546665 0.538208 
1228 run 0.425070 0.571659 
1009 run 0.316554 0.259385 
1109 yadG 0.304657 0.401482 

Я использую stripplot Сиборна, чтобы визуализировать данные:

seaborn.stripplot(df.DM3_r, df.cat, size=7, orient="h", 
       palette="Reds_r", edgecolor="gray", ax=ax.flat[i], linewidth=.5) 

для различных групп "cat" в этом случае. Это прекрасно работает. Однако я хотел бы добавить ошибки "DM3_r_err".

Я уже пробовал errorbar от matplotlib, чтобы добавить график ошибок сверху, но я не смог извлечь позиции точек на морском графике. Скорее всего, это связано с тем, что я использую подзаголовки.

Есть ли прямой способ использования морского дна?

Это как stripplot выглядит (слева) и на правой стороне то, что я стремлюсь к: enter image description here

ответ

2

Там может быть более умные способы, чтобы выбрать данные из Pandas.DataFrame, но что-то вроде это работает:

import pandas as pd 
import matplotlib.pylab as pl 
import seaborn 
import numpy as np 

pl.close('all') 

data = [['hsdM', 3.908949, 1.442363], 
     ['lolD', 1.156828, 0.456434], 
     ['lolD', 3.156828, 0.230174], 
     ['acrB', 0.546665, 0.538208], 
     ['msbA', 0.425070, 0.571659], 
     ['msbA', 2.425070, 1.571659], 
     ['emrA', 0.316554, 1.259385], 
     ['yadG', 0.304657, 0.401482]] 

df = pd.DataFrame(data, columns=['gene','DM3_r','DM3_r_err']) 

pl.figure() 
ax = pl.subplot(111) 

# Everywhere below you would have to replace `ax` with your `ax.flat[i]` 
sp = seaborn.stripplot(df.DM3_r, df.gene, size=7, orient="h", 
        palette="Reds_r", edgecolor="gray", ax=ax, linewidth=.5) 

for y,ylabel in zip(ax.get_yticks(), ax.get_yticklabels()): 
    f = df['gene'] == ylabel.get_text() 
    ax.errorbar(df.DM3_r[f].values, np.ones_like(df.DM3_r[f].values)*y, xerr=df.DM3_r_err[f].values, ls='none') 

enter image description here

+1

Спасибо @Bart. Я фактически вычислил то же самое, используя расположение тика для оси y. – Fourier

Смежные вопросы