python - 如何根据不同的dataFrame部分绘制(plotly.express)多条线
问题描述
例如,我有一个数据框:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame(data = [{'key': '1', 'value': '1', 'metadata': '3'}, {'key': '2', 'value': '2', 'metadata': '3'}, {'key': '1', 'value': '3', 'metadata': '3'}, {'key': '2', 'value': '4', 'metadata':
...: '3'}])
In [3]: df
Out[3]:
key value metadata
0 1 1 3
1 2 2 3
2 1 3 3
3 2 4 3
我想用“键”分割df,即
In [4]: df_list = [d for _, d in df.groupby(['key'])]
In [5]: df_list
Out[5]:
[ key value metadata
0 1 1 3
2 1 3 3,
key value metadata
1 2 2 3
3 2 4 3]
现在我有dataFrame
基于唯一键数量的 N (2) 的列表。我怎样才能用它来绘制这个plotly
?
我可以
In [6]: import plotly.express as px
In [7]: fig = px.line(df_list[0])
但我怎样才能添加其他行?plotly.express.Figure
没有add_line
办法...
解决方案
运行plotly.express
将返回一个plotly.graph_objs._figure.Figure
对象。对于. plotly.graph_objects
_ go.Figure()
因此,在使用 plotly express 构建图形后,您可以使用以下方法添加线条或轨迹:
fig.add_trace(go.Scatter)
或者:
fig.add_scatter()
其他选项是:
fig.add_area()
fig.add_bar()
构建后,fig
您可以运行dir(fig)
以了解更多信息。
所以在这样的数据框中:
2021 2022 2023
0 0 0 0
1 0 -1 -2
2 -1 -1 -3
3 -1 -2 -2
4 -1 -1 -3
您可以使用以下方法将线条/轨迹添加到现有图形:
fig.add_trace(go.Scatter(x = df.index, y = df['2023']))
如果您希望通过字典控制数据子集,添加多个跟踪的一种方法是:
extra = {'2024': df['2024'],
'2025': df['2025']}
for k, v in extra.items():
fig.add_scatter(x=v.index, y = v, name = k + ' from dict' )
完整代码:
import pandas as pd
import numpy as np
import plotly
import plotly.express as px
import plotly.graph_objects as go
# data
np.random.seed(1)
start = 2021
ncols = 6
nrows = 1000
cols = [str(i) for i in np.arange(start, start+ncols)]
df = pd.DataFrame(np.random.randint(-1,2, (nrows,ncols)), columns = cols).cumsum()
df.iloc[0] = 0
# figure
fig = px.line(df, x=df.index, y=cols[:-4])
fig.update_layout(template = 'plotly_dark')
# fig.add_trace(go.Scatter(x = df.index, y = df['2023'], name = '2023 = added trace'))
fig.add_scatter(x = df.index, y = df['2023'], name = '2023 from add_trace')
extra = {'2024': df['2024'],
'2025': df['2025']}
for k, v in extra.items():
fig.add_scatter(x=v.index, y = v, name = k + ' from dict' )
fig.show()
推荐阅读
- vue.js - JSON 数据和 Vuetify 卡
- json - 访问数据时出现此类错误
- mysql - Django ORM 生成的查询不是预期的
- pandas - 在 Pandas 中过滤多索引列的行
- python - NumPy - 是否可以提高相互递归数组计算的性能
- android - 离子电容器 qrscanner 活动兼容性
- node.js - 电子中 app.setAsDefaultProtocolClient 的处理程序
- flutter - '[App.framework] 链接和嵌入式框架'App.framework' Xcode 11.4 其他方式解决的问题?
- php - 使用不同列上的 MAX() 函数从列中返回名称
- arrays - 如何在 Julia 中查找数组中多个元素的位置