plotly 在 seaborn 中的 line_group 模拟

问题描述 投票:0回答:1

函数

plotly.express.line
有一个参数
line_group
允许指定一列来确定每一行。我希望用 seaborn 复制这种行为,但到目前为止没有成功。

这就是我的 pandas 数据框的样子:

                Time (s)  Amplitude (V)  n_trigger signal_name
n_waveform                                                    
3           0.000000e+00       0.001249          1     MCP-PMT
3           5.000000e-11       0.001379          1     MCP-PMT
3           1.000000e-10       0.001558          1     MCP-PMT
3           1.500000e-10       0.001764          1     MCP-PMT
3           2.000000e-10       0.002313          1     MCP-PMT
...                  ...            ...        ...         ...
3332        1.985000e-08       0.004731       1666         DUT
3332        1.990000e-08       0.004847       1666         DUT
3332        1.995000e-08       0.005053       1666         DUT
3332        2.000000e-08       0.004916       1666         DUT
3332        2.005000e-08       0.004648       1666         DUT

像这样使用情节

fig = px.line(
    data_frame = waveforms.reset_index(drop=False).sort_values(['n_waveform','Time (s)']),
    x = 'Time (s)',
    y = 'Amplitude (V)',
    color = 'signal_name',
    line_group = 'n_waveform',
)

我得到了想要的情节,它看起来像这样:

seaborn 我有这个代码

sns.lineplot(
    data = waveforms,
    x = 'Time (s)',
    y = 'Amplitude (V)',
    hue = 'signal_name',
)

生产这个

如何告诉它不要在 y 轴上聚合数据,并使用

n_waveform
列来创建单独的行?

python plotly seaborn
1个回答
0
投票

你要求的问题是 sns.lineplot() 函数包含一些非常具体的统计预处理,用于当你传递整个数据帧时。您可以查看文档:https://seaborn.pydata.org/generated/seaborn.lineplot.html

引用: “以长格式模式传递整个数据集将聚合重复值(每年)以显示平均值和 95% 置信区间”

plotly 图形模块不像 seaborn 那样面向统计,因此它不包含这种预处理。

如果你想要类似的结果,你需要自己预处理数据框。你可以这样做,例如:

#dataframe treatment modules
import numpy as np
import pandas as pd

#generate graphs
import plotly.express as px


# Data Generation
data = {'n_waveform': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
        'Time (s)': [0.0, 5e-11, 1e-10, 1.5e-10, 2e-10, 0.0, 5e-11, 1e-10, 1.5e-10, 2e-10, 0.0, 5e-11, 1e-10, 1.5e-10, 2e-10, 0.0, 5e-11, 1e-10, 1.5e-10, 2e-10],
        'Amplitude (V)': [0.001249, 0.001379, 0.001558, 0.001764, 0.002313, 0.003467, 0.003342, 0.003531, 0.003547, 0.003577, 0.002108, 0.002031, 0.002155, 0.002325, 0.002224, 0.004731, 0.004847, 0.005053, 0.004916, 0.004648],
        'n_trigger': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 834, 834, 834, 834, 834, 1666, 1666, 1666, 1666, 1666],
        'signal_name': ['MCP-PMT', 'MCP-PMT', 'MCP-PMT', 'MCP-PMT', 'MCP-PMT', 'MCP-PMT', 'MCP-PMT', 'MCP-PMT', 'MCP-PMT', 'MCP-PMT', 'DUT', 'DUT', 'DUT', 'DUT', 'DUT', 'DUT', 'DUT', 'DUT', 'DUT', 'DUT']}
df = pd.DataFrame(data)


# Preprocess
df_prep = df.drop(['n_waveform', 'n_trigger'], axis=1)
df_prep = df_prep.groupby(by=['signal_name', 'Time (s)']).mean()
df_prep = df_prep.reset_index()

# Display
waveforms = df_prep
fig = px.line(
    data_frame = waveforms.reset_index(drop=False).sort_values(['Time (s)']),
    x = 'Time (s)',
    y = 'Amplitude (V)',
    color = 'signal_name',
)
fig.show()
© www.soinside.com 2019 - 2024. All rights reserved.