使用plpandas DataFrame的多列使用relplot()进行连续误差条形图

时间:2019-07-09 08:49:13

标签: python pandas seaborn

我将相同物质的光谱数据加载到了熊猫数据帧中,看起来像这样(有20个实验,波数达到2300):

    experiment       0      1      2      3      4
    wave number
    400          358.0  307.1  242.6  364.4  308.2
    401          378.9  328.6  283.7  353.3  319.2
    402          402.4  351.4  320.4  347.6  329.8
    403          434.8  379.1  339.7  362.4  338.8
    404          477.1  412.1  339.7  400.4  345.9
    405          522.0  446.7  334.1  444.9  352.6    ...
    ...

我已经通过手动计算误差线的平均值和值并使用matplotlib plt.errorbar()函数实现了一个粗略但可行的版本。看起来像这样(带有上面的数据):

enter image description here

但是我认为这看起来很难看,所以我想用seaborn。我想要一个看起来像this的情节。

seaborn.relplot()似乎能够准确地计算和绘制所需的内容(如上面的链接所示),但是由于我的数据结构与本教程中使用的数据结构不同,所以我真的不知道该怎么做去做这个。

1 个答案:

答案 0 :(得分:0)

假设您的DF是多索引的,它应该看起来像这样:

                            0      1      2      3      4
experiment wave_number
0          400          358.0  307.1  242.6  364.4  308.2
1          401          378.9  328.6  283.7  353.3  319.2
2          402          402.4  351.4  320.4  347.6  329.8
3          403          434.8  379.1  339.7  362.4  338.8
4          404          477.1  412.1  339.7  400.4  345.9
5          405          522.0  446.7  334.1  444.9  352.6

其中experimentwave_number是索引。我们首先需要使用df.reset_index()将其移动到列。现在看起来应该像这样:

df = df.reset_index()

   experiment  wave_number      0      1      2      3      4
0           0          400  358.0  307.1  242.6  364.4  308.2
1           1          401  378.9  328.6  283.7  353.3  319.2
2           2          402  402.4  351.4  320.4  347.6  329.8
3           3          403  434.8  379.1  339.7  362.4  338.8
4           4          404  477.1  412.1  339.7  400.4  345.9
5           5          405  522.0  446.7  334.1  444.9  352.6

然后,我们需要熔化该DF以使用experimentwave_number的组合产生多行。我们可以使用df.melt()

df = df.melt(id_vars=["experiment", "wave_number"], value_vars=["0", "1", "2", "3", "4"], var_name="measurement_number", value_name="measured_value")

现在应该看起来像这样:

df.sort_values(by=["wave_number", "measurement_number"])

    experiment  wave_number measurement_number measured_value
0            0          400                  0          358.0
6            0          400                  1          307.1
12           0          400                  2          242.6
18           0          400                  3          364.4
24           0          400                  4          308.2
1            1          401                  0          378.9
7            1          401                  1          328.6
13           1          401                  2          283.7
19           1          401                  3          353.3
25           1          401                  4          319.2
2            2          402                  0          402.4
8            2          402                  1          351.4
14           2          402                  2          320.4
20           2          402                  3          347.6
26           2          402                  4          329.8
3            3          403                  0          434.8
9            3          403                  1          379.1
15           3          403                  2          339.7
21           3          403                  3          362.4
27           3          403                  4          338.8
4            4          404                  0          477.1
10           4          404                  1          412.1
16           4          404                  2          339.7
22           4          404                  3          400.4
28           4          404                  4          345.9
5            5          405                  0          522.0
11           5          405                  1          446.7
17           5          405                  2          334.1
23           5          405                  3          444.9
29           5          405                  4          352.6

由于某些原因,我的measured_value列是字符串,因此我将其转换为浮点数:

df.measured_value = df.measured_value.astype(float)

现在绘制海洋情节非常简单:

import seaborn as sns
import matplotlib.pyplot as plt
sns.relplot(x="wave_number", y="measured_value", kind="line", data=df)
plt.show()

哪个给这个:

Resulting plot