使用pandas DataFrame中的误差线和数据点绘制线图

时间:2014-10-15 11:04:08

标签: python matplotlib pandas plot

我一直绞尽脑汁试图弄清楚如何以我想要的方式绘制大熊猫DataFrame,但无济于事。

DataFrame有一个MultiIndex,它看起来像这样:

+-----------+--------------+------------+--------------+-----------------+---------+---------+---------+---------+---------+
|           |              |            |              |                 | 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  |
+-----------+--------------+------------+--------------+-----------------+---------+---------+---------+---------+---------+

我想要做的是绘制一个折线图,其中x值是' file_count' value,每个y值是DataFrame中相应行的所有run_xxx值的平均值。

如果可能的话,我想添加错误栏甚至是数据点本身,这样我就可以看到数据分布的平均值。

这是一个(糟糕的)模型,大致是我所说的:

mockup of desired graph

我已经能够使用内置于pandas'中的boxplot()函数创建一个箱线图。通过执行DataFrame:

df.transpose().boxplot()

这看起来几乎没问题,但有点混乱,并没有绘制实际数据点。

2 个答案:

答案 0 :(得分:1)

在这种情况下,

Beeswarm情节非常好,特别是当你有很多点以及显示这些点的分布的内容时。但是,您需要将position参数提供给beeswarm,因为默认情况下它将从0开始。boxplot pandas的{​​{1}}方法,另一方面,在x = 1,2 ......

处绘制框

归结为以下几点:

DataFrame

enter image description here

答案 1 :(得分: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()

这将显示带有误差线和数据点的折线图。上述代码中可能存在一些错误。在复制之前我复制了它并简化了一点。