Python:如何使用 Plotly 堆叠或叠加直方图
Python: How to stack or overlay histograms using Plotly
我在不同的列表中有两组数据。每个列表元素都有一个来自 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
中重复元素数量的条形图组成。
我的问题是:如何使用相同的“计数”直方图在同一轴上叠加第二组数据?
执行此操作的一种方法是简单地添加另一条轨迹,您就快成功了!用于创建这些示例的数据集可以在本 post.
的最后一节中找到
注:
下面的代码使用 'lower-level' plotly API,因为(个人)我觉得它更透明,让用户能够看到正在绘制的内容,以及为什么;而不是依赖 graph_objects
和 express
.
的便捷模块
选项 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:
选项 2 - 曲线图:
另一种选择是绘制分布曲线(高斯 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:
关联的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:
数据集:
以下是用于模拟 [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()
我在不同的列表中有两组数据。每个列表元素都有一个来自 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
中重复元素数量的条形图组成。
我的问题是:如何使用相同的“计数”直方图在同一轴上叠加第二组数据?
执行此操作的一种方法是简单地添加另一条轨迹,您就快成功了!用于创建这些示例的数据集可以在本 post.
的最后一节中找到注:
下面的代码使用 'lower-level' plotly API,因为(个人)我觉得它更透明,让用户能够看到正在绘制的内容,以及为什么;而不是依赖 graph_objects
和 express
.
选项 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:
选项 2 - 曲线图:
另一种选择是绘制分布曲线(高斯 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:
关联的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:
数据集:
以下是用于模拟 [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()