我将相同物质的光谱数据加载到了熊猫数据帧中,看起来像这样(有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()函数实现了一个粗略但可行的版本。看起来像这样(带有上面的数据):
但是我认为这看起来很难看,所以我想用seaborn。我想要一个看起来像this的情节。
seaborn.relplot()似乎能够准确地计算和绘制所需的内容(如上面的链接所示),但是由于我的数据结构与本教程中使用的数据结构不同,所以我真的不知道该怎么做去做这个。
答案 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
其中experiment
和wave_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以使用experiment
和wave_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()
哪个给这个: