如何根据不同的数据帧部分绘制plotly.express多条线 完整代码:

问题描述

例如我有一个数据框:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(data = [{'key': '1','value': '1','Metadata': '3'},{'key': '2','value': '2',{'key': '1','value': '3','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]

现在我有基于唯一键数量的 N (2) dataFrame 列表。如何使用 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_objectsgo.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' )

enter image description here

完整代码:

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,name = '2023 from add_trace')


extra = {'2024': df['2024'],name = k + ' from dict' )

fig.show()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...