我一直绞尽脑汁试图弄清楚如何以我想要的方式绘制大熊猫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值的平均值。
如果可能的话,我想添加错误栏甚至是数据点本身,这样我就可以看到数据分布的平均值。
这是一个(糟糕的)模型,大致是我所说的:
我已经能够使用内置于pandas'中的boxplot()函数创建一个箱线图。通过执行DataFrame:
df.transpose().boxplot()
这看起来几乎没问题,但有点混乱,并没有绘制实际数据点。
答案 0 :(得分:1)
Beeswarm情节非常好,特别是当你有很多点以及显示这些点的分布的内容时。但是,您需要将position
参数提供给beeswarm
,因为默认情况下它将从0开始。boxplot
pandas
的{{1}}方法,另一方面,在x = 1,2 ......
归结为以下几点:
DataFrame
答案 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()
这将显示带有误差线和数据点的折线图。上述代码中可能存在一些错误。在复制之前我复制了它并简化了一点。