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
列来创建单独的行?
你要求的问题是 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()