【问题标题】:Pandas: How to plot multiple dataframes with same index on the same plot using plotly?Pandas:如何使用 plotly 在同一个图上绘制具有相同索引的多个数据框?
【发布时间】:2021-06-25 14:30:15
【问题描述】:

我有几个数据框,每个数据框都专用于 1 个城市。 日期列是索引。它们都共享相同的日期索引。唯一的列是该城市当天的销售额,列名是城市名称。它们看起来像这样:

+------------+--------+
| date       | City_A |
+------------+--------+
| 2020-01-01 | ...    |
+------------+--------+
| 2020-01-02 | ...    |
+------------+--------+
| ...        |        |
+------------+--------+
| 2020-12-30 | ...    |
+------------+--------+
| 2020-12-31 | ...    |
+------------+--------+
+------------+--------+
| date       | City_B |
+------------+--------+
| 2020-01-01 | ...    |
+------------+--------+
| 2020-01-02 | ...    |
+------------+--------+
| ...        |        |
+------------+--------+
| 2020-12-30 | ...    |
+------------+--------+
| 2020-12-31 | ...    |
+------------+--------+
+------------+--------+
| date       | city_C |
+------------+--------+
| 2020-01-01 | ...    |
+------------+--------+
| 2020-01-02 | ...    |
+------------+--------+
| ...        |        |
+------------+--------+
| 2020-12-30 | ...    |
+------------+--------+
| 2020-12-31 | ...    |
+------------+--------+

我想将 2020 年所有城市的日销售额绘制在一张折线图中,x 轴是日期,y 轴是日销售额。 在 Plotly 中,每个城市都有自己独特的颜色线。

通常,如果我只有几个城市(例如,3 个城市),我会将 3 个数据框合并在一起并绘制它。但是,我拥有的真实数据包含 30 多个城市,所以我想知道在绘制之前合并所有这 30 多个城市的单独数据框是否有意义?有没有一种快速而优雅的方式将它们绘制在一起,而不必先合并 30 多个数据帧?

非常感谢您的帮助!

【问题讨论】:

  • 我拥有的真实数据包含 30 多个数据帧。我想知道在绘图之前将所有这些数据框合并在一起是否有意义。
  • 您想要每个城市一条线路吗?如果是这样,您可以制作子图/将 taces 添加到具有共享轴的图形中,并使用单独的 df 作为每行的数据
  • 哦....对不起,我没有阅读您的完整问题
  • 您如何将 30 多个数据帧存储在列表中、字典中?

标签: pandas dataframe plot plotly plotly-python


【解决方案1】:
    1. 生成样本数据:

import numpy as np
import pandas as pd 
import datetime


data1 = pd.DataFrame({'date':[datetime.date(2021,1,1) + datetime.timedelta(days=i) for i in range(20)],
'city1': np.random.randint(0, 20, size=(20))})

data2 = pd.DataFrame({'date':[datetime.date(2021,1,1) + datetime.timedelta(days=i) for i in range(20)],
'city2': np.random.randint(0, 20, size=(20))})


data3 = pd.DataFrame({'date':[datetime.date(2021,1,1) + datetime.timedelta(days=i) for i in range(20)],
'city3': np.random.randint(0, 20, size=(20))})

dataall = data1.merge(data2).merge(data3)
# dataall = data1.merge(data2, how='left', left_on='date', right_on='date')
dataall

显示数据:

    1. 使用 plotly 在一个图中绘制多条线或条
import plotly.graph_objs as go

fig = go.Figure()
for col in ['city1', 'city2', 'city3']:

    fig.add_trace(go.Scatter(x = dataall['date'], y = dataall[col], name=col))
fig.show()

Plotlygraph_objs方法可以在同一个图形上添加很多复杂的图形,很安静。获取更多详情,点击链接:https://plotly.com/python/line-charts/

【讨论】:

    【解决方案2】:

    有无数种方法可以做到这一点。就您而言,最佳方法将取决于您愿意如何处理数据框。我会强烈考虑将它们重塑为长格式,然后将它们连接起来,这样你最终会得到 one 数据框,如下所示:

            date city  value
    0 2020-01-01    A      1
    1 2020-02-01    A      2
    2 2020-03-01    A      2
    0 2020-01-01    B      3
    1 2020-02-01    B      2
    2 2020-03-01    B      3
    0 2020-01-01    C      2
    1 2020-02-01    C      2
    2 2020-03-01    C      4
    

    现在您可以释放情节表达的力量并在一行中处理绘图:

    px.line(df, x = 'date', y = 'value', color = 'city')
    

    情节一:情节表达

    如果由于某种原因您坚持使用单独的数据框,我会将它们组织在字典中,以便您可以轻松地在 for loop 中处理它们并像这样使用 fig.add_traces(go.Scatter)

    dfs = {'A': df1,
           'B': df2,
           'C': df3}
    
    fig = go.Figure()
    for df in dfs:
        col = 'City_' + df
        fig.add_traces(go.Scatter(x = dfs[df].date, y = dfs[df][col],
                                  mode = 'lines',name = col))
    

    情节2:go.Scatter

    情节相同,图例和轴符号略有不同。

    情节 1 的完整代码:

    import pandas as pd
    import plotly.graph_objects as go
    import plotly.express as px
    
    df1 = pd.DataFrame({'date': pd.to_datetime(['2020.01.01', '2020.02.01' , '2020.03.01']),
                        'city': ['A', 'A', 'A'],
                        'value':[1,2,2]})
    
    df2 = pd.DataFrame({'date': pd.to_datetime(['2020.01.01', '2020.02.01' , '2020.03.01']),
                        'city': ['B', 'B', 'B'],
                        'value':[3,2,3]})
    
    df3 = pd.DataFrame({'date': pd.to_datetime(['2020.01.01', '2020.02.01' , '2020.03.01']),
                        'city': ['C', 'C', 'C'],
                        'value':[2,2,4]})
    
    df = pd.concat([df1, df2, df3], axis = 0)
    
    fig = px.line(df, x = 'date', y = 'value', color = 'city')
    fig.show()
    

    情节 2 的完整代码:

    import pandas as pd
    import plotly.graph_objects as go
    import plotly.express as px
    df1 = pd.DataFrame({'date': pd.to_datetime(['2020.01.01', '2020.02.01' , '2020.03.01']),
                        'City_A':[1,2,2]})
    
    df2 = pd.DataFrame({'date': pd.to_datetime(['2020.01.01', '2020.02.01' , '2020.03.01']),
                        'City_B':[3,2,3]})
    
    df3 = pd.DataFrame({'date': pd.to_datetime(['2020.01.01', '2020.02.01' , '2020.03.01']),
                        'City_C':[2,2,4]})
    
    dfs = {'A': df1,
           'B': df2,
           'C': df3}
    
    fig = go.Figure()
    for df in dfs:
        col = 'City_' + df
        fig.add_traces(go.Scatter(x = dfs[df].date, y = dfs[df][col],
                                  mode = 'lines',name = col))
        
    fig.show()
    

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 2016-10-21
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 2019-06-12
      • 1970-01-01
      相关资源
      最近更新 更多