【问题标题】:Is it possible to create a subplot with plotly.express?是否可以使用 plotly.express 创建子图?
【发布时间】:2021-01-15 15:36:40
【问题描述】:

我想用plotly.express.line 函数创建一个带有 2 个图的子图,可以吗?鉴于 2 情节:

fig1 =px.line(df, x=df.index, y='average')
fig1.show()

fig2 = px.line(df, x=df.index, y='Volume')
fig2.show()

我想生成一个由 2 个子图组成的独特图(在示例 fig1 和 fig2 中)

【问题讨论】:

    标签: python plotly


    【解决方案1】:

    是的,您可以使用 plotly express 构建子图。要么

    1.直接通过参数facet_rowfacet_colums(在这种情况下我们经常谈论facet plots,但它们是同一个东西),或者

    2.间接通过“窃取”用 plotly express 构建的图形中的元素,并在标准 make_subplots()fig.add_traces() 中使用它们


    方法一:Facet and Trellis Plots in Python

    虽然 plotly.express 支持宽格式和长格式的数据,但我通常更喜欢从后者构建分面图。如果你有这样的数据集:

        Date variable  value
    0  2019-11-04  average      4
    1  2019-11-04  average      2
    .
    .
    8  2019-12-30   volume      5
    9  2019-12-30   volume      2
    

    然后您可以通过以下方式构建子图:

    fig = px.line(df, x='Date', y = 'value', facet_row = 'variable')
    

    情节1:

    默认情况下,px.line() 会将相同的颜色应用于两条线,但您可以通过以下方式轻松处理:

    fig.update_traces(line_color)
    

    这个完整的 sn-p 向您展示了如何:

    import plotly.graph_objects as go
    import plotly.express as px
    import pandas as pd
    
    df = pd.DataFrame({'Date': ['2019-11-04', '2019-11-04', '2019-11-18', '2019-11-18', '2019-12-16', '2019-12-16', '2019-12-30', '2019-12-30'],
                      'variable':['average', 'volume', 'average', 'volume', 'average','volume','average','volume'],
                      'value': [4,2,6,5,6,7,5,2]})
    
    fig = px.line(df, x='Date', y = 'value', facet_row = 'variable')
    
    fig.update_traces(line_color = 'red', row = 2)
    
    fig.show()
    

    方法二:make_subplots

    既然 plotly express 可以用相当复杂的数据集做一些非常了不起的事情,我认为你没有理由不偶然发现你想使用 elements一个情节表达图作为子情节的来源。这是很有可能的。

    下面是一个示例,我使用px.linepx.data.stocks() 数据集上绘制图形表达数字。然后我继续使用add_tracego.ScatterFor Loop 中提取一些感兴趣的元素来构建子图设置。您当然可以争辩说您可以直接在数据源上轻松地执行此操作。但话又说回来,正如最初所说,plotly express 本身就是一个出色的数据处理程序。

    情节2:使用情节表达图作为来源的子情节:

    完整代码:

    import plotly.graph_objects as go
    import plotly.express as px
    import pandas as pd
    
    from plotly.subplots import make_subplots
    
    df = px.data.stocks().set_index('date')
    
    fig1 = px.line(df[['GOOG', 'AAPL']])
    fig2 = px.line(df[['AMZN', 'MSFT']])
    
    fig = make_subplots(rows=2, cols=1)
    
    for d in fig1.data:
        fig.add_trace((go.Scatter(x=d['x'], y=d['y'], name = d['name'])), row=1, col=1)
            
    for d in fig2.data:
        fig.add_trace((go.Scatter(x=d['x'], y=d['y'],  name = d['name'])), row=2, col=1)
        
    fig.show()
    

    【讨论】:

      【解决方案2】:

      从文档中,Plotly 表达does not support arbitrary subplot capabilities。您可以改为使用图形对象和跟踪(注意 go.Scatter 是等效的):

      import pandas as pd
      
      from plotly.subplots import make_subplots
      import plotly.graph_objects as go
      
      ## create some random data
      df = pd.DataFrame(
          data={'average':[1,2,3], 'Volume':[7,3,6]}, 
          index=['a','b','c']
      )
      
      fig = make_subplots(rows=1, cols=2)
      
      fig.add_trace(
          go.Scatter(x=df.index, y=df.average, name='average'),
          row=1, col=1
      )
      
      fig.add_trace(
          go.Scatter(x=df.index, y=df.Volume, name='Volume'),
          row=1, col=2
      )
      
      fig.show()
      

      【讨论】:

        【解决方案3】:

        如果您刚刚生成了px 用于制作子图的图形,则无需使用graph_objects 模块。这是完整的代码。

        import plotly.express as px
        import pandas as pd
        from plotly.subplots import make_subplots
        
        df = px.data.stocks().set_index('date')
        
        fig1 = px.line(df[['GOOG', 'AAPL']])
        fig2 = px.line(df[['AMZN', 'MSFT']])
        
        fig = make_subplots(rows=2, cols=1)
        
        fig.add_trace(fig1['data'][0], row=1, col=1)
        fig.add_trace(fig1['data'][1], row=1, col=1)
        fig.add_trace(fig2['data'][0], row=2, col=1)
        fig.add_trace(fig2['data'][1], row=2, col=1)
            
        fig.show()
        

        如果每个图中有两个以上的变量,可以使用 for 循环也可以使用fig.add_trace 方法添加跟踪。

        【讨论】:

          猜你喜欢
          • 2021-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-31
          • 1970-01-01
          相关资源
          最近更新 更多