2014-10-15 1 views
2

Я пытаюсь понять, как построить панды DataFrame так, как я хочу, но безрезультатно.Построение линейного графика с барами ошибок и точками данных из панд DataFrame

DataFrame имеет мультииндексных и это выглядит следующим образом:

+-----------+--------------+------------+--------------+-----------------+---------+---------+---------+---------+---------+ 
|   |    |   |    |     | run_001 | run_002 | run_003 | run_004 | run_005 | 
+-----------+--------------+------------+--------------+-----------------+---------+---------+---------+---------+---------+ 
| file_type | server_count | file_count | thread_count | cacheclear_type |   |   |   |   |   | 
+-----------+--------------+------------+--------------+-----------------+---------+---------+---------+---------+---------+ 
| gor  | 01servers | 05files | 20threads | ccALWAYS  | 15.918 | 16.275 | 15.807 | 17.781 | 16.233 | 
| gor  | 01servers | 10files | 20threads | ccALWAYS  | 17.322 | 17.636 | 16.096 | 16.484 | 16.715 | 
| gor  | 01servers | 15files | 20threads | ccALWAYS  | 19.265 | 17.128 | 17.630 | 18.739 | 16.833 | 
| gor  | 01servers | 20files | 20threads | ccALWAYS  | 23.744 | 20.539 | 21.416 | 22.921 | 22.794 | 
+-----------+--------------+------------+--------------+-----------------+---------+---------+---------+---------+---------+ 

То, что я хочу сделать, это сюжет линейный график, где значения х являются «FILE_COUNT» значение, а значение у для каждого есть среднее значение всех значений run_xxx для соответствующей строки в DataFrame.

Если возможно, я хотел бы добавить строки ошибок и даже сами точки данных, чтобы я мог видеть распределение данных за этим средним значением.

Вот (дерьмовый) макет примерно то, что я говорю о:

mockup of desired graph

Я был в состоянии создать boxplot с помощью boxplot() функция встроена в панд DataFrame делая :

df.transpose().boxplot() 

Это выглядит почти нормально, но немного суматоху и не фактические точки данных графически.

ответ

1

Beeswarm участок будет очень приятным в этой ситуации, особенно если у вас много точек и что показывать распределения этих точек. Вы должны, однако, поставить параметр position в beeswarm, как по умолчанию он начал в 0. При boxplot метод pandasDataFrame, с другой стороны, участки коробки при х = 1, 2 ...

Это сводится только этим:

from beeswarm import * 
D1 = beeswarm(df.values, positions = np.arange(len(df.values))+1) 
D2 = df.transpose().boxplot(ax=D1[1]) 

enter image description here

+0

Спасибо, это определенно помогает, хотя мне удалось вырваться из этого пути сегодня. Я отвечу на ваш ответ, хотя он отвечает на мой вопрос, и я ценю усилия. – StFS

1

для полноты я буду включать, как я, наконец, удалось сделать это здесь:

import numpy as np 
import matplotlib.pyplot as plt 
import random 

dft = df.sortlevel(2).transpose() 

fig, ax = plt.subplots() 

x = [] 
y = [] 
y_err = [] 

scatterx = [] 
scattery = [] 

for n, col in enumerate(dft.columns): 
    x.append(n) 
    y.append(np.mean(dft[col])) 
    y_err.append(np.std(dft[col])) 

    for v in dft[col]: 
     scattery.append(v) 
     scatterx.append(n + ((random.random()-0.5)*0.05)) 

p = plt.plot(x, y, label=label) 
color=p[0].get_color() 
plt.errorbar(x, y, yerr=y_err, fmt=color) 
plt.scatter(scatterx, scattery, alpha=0.3, color=color) 

plt.legend(loc=2) 
ax.set_xticks(range(len(dft.columns))) 
ax.set_xticklabels([x[2] for x in dft.columns]) 
plt.show() 

Это покажет линейную диаграмму с барами ошибок и точками данных. В приведенном выше коде могут быть некоторые ошибки. Я скопировал его и немного упростил, прежде чем вставлять сюда.

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