用 plotly express 覆盖两个直方图

Posted

技术标签:

【中文标题】用 plotly express 覆盖两个直方图【英文标题】:Overlaying two histograms with 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 之间的完整性和不同抽象级别。

【问题讨论】:

【参考方案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 的堆叠直方图

【讨论】:

以上是关于用 plotly express 覆盖两个直方图的主要内容,如果未能解决你的问题,请参考以下文章

Plotly express - 使用下拉菜单绘制直方图不同列的代码

带有不透明条的直方图

如何在闪亮的直方图中动态添加和删除覆盖

R语言plotly可视化:plotly可视化二维直方图等高线图使用子图的方式在二维直方图等高线图的顶部和右侧添加两个变量的边缘直方图(2D Histogram Contour Subplot)

用 plotly 动画直方图

在 Plotly Python 中使用时间滑块绘制连续直方图