Непрерывный график ошибок с помощью relplot () с использованием нескольких столбцов панд DataFrame - PullRequest
1 голос
/ 09 июля 2019

У меня есть спектральные данные того же вещества, загруженные в панду DataFrame, который выглядит примерно так (есть 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 голосов
/ 09 июля 2019

Предполагая, что ваш 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()

Что дает:

Resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...