【问题标题】:how to plot (plotly.express) multiple lines based on different dataFrame parts如何根据不同的dataFrame部分绘制(plotly.express)多条线
【发布时间】:2021-05-18 06:48:56
【问题描述】:

我有一个数据框,例如:

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]

现在我有基于唯一键数量的 N (2) dataFrames 列表。如何使用plotly 绘制此图?

我可以

In [6]: import plotly.express as px

In [7]: fig = px.line(df_list[0])

但是如何添加其他行? plotly.express.Figure 没有 add_line 方法...

【问题讨论】:

    标签: python pandas plotly plotly-express


    【解决方案1】:

    运行 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' )
    

    完整代码:

    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()
    

    【讨论】:

    • 你的回答似乎真的很棒,但我想我问错了问题......这是我的 csv:设备,名称,稳定温度(C),元数据 01:00.0,a,40, foo 03:00.0,a,42,foo 01:00.0,b,38,foo 03:00.0,b,44,foo 01:00.0,c,41,foo 03:00.0,c,42,foo 01:00.0, d,20,foo 03:00.0,d,28,foo 我想绘制它以便变量 = 设备、x = 名称、y = 温度,并且元数据是悬停的 - 我不能让你的答案坚持下去这种情况
    • @CIsForCookies 包含here 所述的数据样本,我相信我们可以坚持下去。
    • {'设备': {0: '01:00.0', 1: '03:00.0', 2: '01:00.0', 3: '03:00.0', 4: '01 :00.0', 5: '03:00.0', 6: '01:00.0', 7: '03:00.0'}, '名称': {0: 'a', 1: 'a', 2: 'b ', 3: 'b', 4: 'c', 5: 'c', 6: 'd', 7: 'd'}, '稳定温度 (C)': {0: 40, 1: 42, 2: 38, 3: 44, 4: 41, 5: 42, 6: 20, 7: 28}, '元数据': {0: 'foo', 1: 'foo', 2: 'foo', 3: 'foo', 4: 'foo', 5: 'foo', 6: 'foo', 7: 'foo'}}
    • 顺便说一句,我正在研究pd.melt - 因为我认为它会给出一个简洁的解决方案。还没有成功..
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多