Python:如何使用 Plotly 堆叠或叠加直方图

标签 python python-3.x graph plotly histogram

我在不同的列表中有两组数据。每个列表元素都有一个从 0:100 开始的值,并且元素重复。

例如:
first_data = [10,20,40,100,...,100,10,50]
second_data = [20,50,50,10,...,70,10,100]

我可以使用以下方法在直方图中绘制其中一个:

import plotly.graph_objects as go
.
.
.

fig = go.Figure()
fig.add_trace(go.Histogram(histfunc='count', x=first_data))
fig.show()

通过将 histfunc 设置为 'count',我的直方图由一个从 0 到 100 的 x 轴和表示 first_data 中重复元素数量的条形组成

我的问题是:如何使用相同的“计数”直方图将第二组数据叠加在同一轴上?

最佳答案

执行此操作的一种方法是简单地添加另一条轨迹,您就快成功了!用于创建这些示例的数据集可以在本文的最后一部分找到。

注意:
以下代码使用“低级”绘图 API,因为(个人)我觉得它更透明,使用户能够看到正在绘制的内容以及原因;而不是依赖 graph_objectsexpress 的便捷模块。

选项 1 - 叠加条:

from plotly.offline import plot

layout = {}
traces = []

traces.append({'x': data1, 'name': 'D1', 'opacity': 1.0})
traces.append({'x': data2, 'name': 'D2', 'opacity': 0.5})

# For each trace, add elements which are common to both.
for t in traces:
    t.update({'type': 'histogram',
              'histfunc': 'count',
              'nbinsx': 50})

layout['barmode'] = 'overlay'

plot({'data': traces, 'layout': layout})

输出 1:

enter image description here

选项 2 - 曲线图:

另一种选择是绘制分布曲线(Gaussian KDE),如此处所示。值得注意的是,此方法绘制的是概率密度,而不是计数。

X1, Y1 = calc_curve(data1)
X2, Y2 = calc_curve(data2)

traces = []
traces.append({'x': X1, 'y': Y1, 'name': 'D1'})
traces.append({'x': X2, 'y': Y2, 'name': 'D2'})

plot({'data': traces})

输出 2:

enter image description here

相关的 calc_curve() 函数:

from scipy.stats import gaussian_kde

def calc_curve(data):
    """Calculate probability density."""
    min_, max_ = data.min(), data.max()
    X = [min_ + i * ((max_ - min_) / 500) for i in range(501)]
    Y = gaussian_kde(data).evaluate(X)
    return(X, Y)

选项 3 - 绘制条形图和曲线:

或者,您始终可以将这两种方法组合在一起,使用 ya 轴上的概率密度。

layout = {}
traces = []

traces.append({'x': data1, 'name': 'D1', 'opacity': 1.0})
traces.append({'x': data2, 'name': 'D2', 'opacity': 0.5})

for t in traces:
    t.update({'type': 'histogram',
              'histnorm': 'probability density',
              'nbinsx': 50})

traces.append({'x': X1, 'y': Y1, 'name': 'D1'})
traces.append({'x': X2, 'y': Y2, 'name': 'D2'})

layout['barmode'] = 'overlay'

plot({'data': traces, 'layout': layout})  

输出 3:

enter image description here

数据集:

下面是用于模拟 [0,100] 值数据集并创建这些示例的代码:

import numpy as np
from sklearn.preprocessing import MinMaxScaler

mms = MinMaxScaler((0, 100))
np.random.seed(4)
data1 = mms.fit_transform(np.random.randn(10000).reshape(-1, 1)).ravel()
data2 = mms.fit_transform(np.random.randn(10000).reshape(-1, 1)).ravel()

关于Python:如何使用 Plotly 堆叠或叠加直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64850230/

相关文章:

Python 3 : setup. py:执行所有操作的 pip 安装 (build_ext + install)

python - 创建重复的圆x和y轴python

algorithm - Kamada & Kawai 图布局算法?

java - JSP:创建图表

python - 如何从 Bokeh 中的数据帧制作折线图?

python - 在django中创建原子事务是否会自动创建锁

python - 将行附加到文件,然后读取它们

python - Django操作错误: no such column

Python Wand 如何调整大小以保持纵横比并用透明度填充剩余空间

java - 如何读取 rsa 公钥形式字符串(由 java 生成,我想用 Python 读取它)