【问题标题】:Overlaying two histograms with plotly express用 plotly express 覆盖两个直方图
【发布时间】:2020-01-19 03:58:08
【问题描述】:

我想使用以下简单代码叠加两个直方图,我目前只显示一个并排显示。这两个数据帧长度不同,但叠加它们的直方图值仍然有意义。

import plotly.express as px

fig1 = px.histogram(test_lengths, x='len', histnorm='probability', nbins=10)
fig2 = px.histogram(train_lengths, x='len', histnorm='probability', nbins=10)
fig1.show()
fig2.show()

纯情节,就是这样,抄自the documentation

import plotly.graph_objects as go

import numpy as np

x0 = np.random.randn(500)
# Add 1 to shift the mean of the Gaussian distribution
x1 = np.random.randn(500) + 1

fig = go.Figure()
fig.add_trace(go.Histogram(x=x0))
fig.add_trace(go.Histogram(x=x1))

# Overlay both histograms
fig.update_layout(barmode='overlay')
# Reduce opacity to see both histograms
fig.update_traces(opacity=0.75)
fig.show()

我只是想知道情节表达是否有任何特别惯用的方式。希望这也有助于说明 plotly 和 plotly express 之间的完整性和不同抽象级别。

【问题讨论】:

    标签: plotly plotly-express


    【解决方案1】:

    诀窍是通过将数据组合成一个整洁的数据框来制作一个 Plotly Express 图形,而不是制作两个图形并尝试将它们组合起来(目前这是不可能的):

    import numpy as np
    import pandas as pd
    import plotly.express as px
    
    x0 = np.random.randn(250)
    # Add 1 to shift the mean of the Gaussian distribution
    x1 = np.random.randn(500) + 1
    
    df =pd.DataFrame(dict(
        series=np.concatenate((["a"]*len(x0), ["b"]*len(x1))), 
        data  =np.concatenate((x0,x1))
    ))
    
    px.histogram(df, x="data", color="series", barmode="overlay")
    

    产量:

    【讨论】:

    • 是的,我知道。与纯绘图相比,这似乎是一种可用性回归,您可以更自然地将数字堆叠到同一个绘图上,而无需像这样破解数组。我不确定 plotly express 是否试图填充 plotly 所做的每个用例。实际上,我为此重新使用了纯情节。
    • 我想这是一个视角问题 :) 我们认为 Plotly Express 是一个严格的可用性改进:它可以用于使用底层 graph_objects 自动创建多种类型的图形,同时什么也不做远离graph_objects 层(即没有“回归”!)。就像 Seaborn 不是 matplotlib 的 100% 替代品,也不会从 matplotlib 中拿走任何东西,比如说 ;) 随着时间的推移,我们将继续扩大您可以使用 Plotly Express 做的事情的范围,可能包括图形合成等,但即便如此,我们也会从较低级别的 API 中获取任何内容。
    • 您似乎不需要制作长格式/整洁的数据框,您可以将数据作为单独的列,省略颜色参数(它将为此目的使用列)和确保包括 barmode="overlay"
    • 正确,从 4.9 版开始,您可以将系列放在单独的列或向量中:) 我会更新答案。
    【解决方案2】:

    您可以获取 px 结构并使用它来创建图形。我希望使用“颜色”选项来显示堆叠直方图,该选项在表达中但很难在纯情节中重新创建。

    给定一个数据框 (df),其中 utctimestamp 作为时间索引、严重性和类别作为直方图中要计算的内容,我使用它来获得堆叠直方图:

    figure_data=[]
    figure_data.extend([i for i in px.histogram(df, x="utctimestamp", color="severity", histfunc="count").to_dict()['data']])
    figure_data.extend([i for i in px.histogram(df, x="utctimestamp", color="category", histfunc="count").to_dict()['data']])
    fig=go.Figure(figure_data)
    fig.update_layout(barmode='stack')
    fig.update_traces(overwrite=True, marker={"opacity": 0.7}) 
    fig.show()
    

    tl;dr px.histogram 创建一个直方图对象列表,您可以将其作为列表抓取并通过go.Figure 呈现。

    我不能内联发布,但这里是来自 px https://imgur.com/a/l7BblZo 的堆叠直方图

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-27
      • 2013-10-17
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2013-04-07
      • 2018-08-02
      • 2020-09-28
      相关资源
      最近更新 更多