Plotly:如何绘制累积 "steps" 直方图?
Plotly: How to plot a cumulative "steps" histogram?
我正在尝试在 python 中使用 Plotly 绘制累积直方图,但使其看起来像 "steps",即没有颜色的条形图,仅显示顶行。像这样:
基本上,我正在尝试重现以下 matplotlib 代码的行为:
import matplotlib.pyplot as plt
plt.hist(x, cumulative=True, histtype='step')
到目前为止,我能做的最好的是:
import plotly.graph_objs as go
from plotly.offline import iplot
h = go.Histogram(x=x,
cumulative=dict(enabled=True),
marker=dict(color="rgba(0,0,0,0)",
line=dict(color="red", width=1)))
iplot([h])
结果如下:
那么有什么技巧呢?
如果您愿意在绘制数据之前处理分箱和累积,您可以使用形状为 属性 的 go.Scatter
对象设置为 'hvh'
.
剧情:
代码: Jupyter Notebook 设置
#imports
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import numpy as np
import pandas as pd
# qtconsole for debugging
#%qtconsole -- style vim
# Notebook settings
init_notebook_mode(connected=True)
# Some sample data
x = np.random.normal(50, 5, 500)
binned = np.histogram(x, bins=25, density=True)
plot_y = np.cumsum(binned[0])
# Line
trace1 = go.Scatter(
x=binned[1],
y=plot_y,
mode='lines',
name="X",
hoverinfo='all',
line=dict(color = 'rgb(1255, 0, 0)', shape='hvh'
)
)
data = [trace1]
# Layout
layout = dict(title = 'Binned data from normal distribution',
legend=dict(
y=0.5,
traceorder='reversed',
font=dict(
size=16
)
)
)
# Make figure
fig = dict(data=data, layout=layout)
# Plot
iplot(fig, filename='line-shapes')
我希望这是你可以使用的东西!
如果没有,请随时告诉我。
一些细节:
数据样本是使用np.random.normal()
制作的。 x
是均值 = 50、sigma = 5 和 500 个观测值的抽样正态分布。 x
然后使用 np.histogram()
和 returns 两个数组放入 50 个 bin 中。这些用作绘图的数据源。
可能的替代方法:
我还尝试将您的代码段与一些随机样本数据一起使用,并将 shape='hvh'
包含在您的 line=dict(color="red", width=1)
中。但这似乎没有用。我还考虑过修改 go.Histogram()
的布局,以便只绘制条形图的顶行,但我认为这是不可能的。
可接受的解决方案可行,但可能会受到限制,因为垃圾箱的宽度都相等。一种方法是使用 matplotlib 计算统计数据,然后使用 plotly 进行绘图:
# sample data
# I am not using a normal distribution on purpose so that the effect of varying bin widths is apparent.
x = np.random.rand(100)
# use matplotlib to get "n" and "bins"
# n_bins will affect the resolution of the cumilative histogram but not dictate the bin widths.
n_bins = 100
n, bins, patches = plt.hist(x, n_bins, density=True, histtype='step', cumulative=-1)
# use plotly (v3) to plot
data = []
trace = go.Scatter(
x=bins,
y=n,
mode='lines',
name= "test",
line=dict(
shape='hvh'
)
)
data.append(trace)
fig = go.Figure(data=data)
iplot(fig)
结果应该是这样的:
我正在尝试在 python 中使用 Plotly 绘制累积直方图,但使其看起来像 "steps",即没有颜色的条形图,仅显示顶行。像这样:
基本上,我正在尝试重现以下 matplotlib 代码的行为:
import matplotlib.pyplot as plt
plt.hist(x, cumulative=True, histtype='step')
到目前为止,我能做的最好的是:
import plotly.graph_objs as go
from plotly.offline import iplot
h = go.Histogram(x=x,
cumulative=dict(enabled=True),
marker=dict(color="rgba(0,0,0,0)",
line=dict(color="red", width=1)))
iplot([h])
结果如下:
那么有什么技巧呢?
如果您愿意在绘制数据之前处理分箱和累积,您可以使用形状为 属性 的 go.Scatter
对象设置为 'hvh'
.
剧情:
代码: Jupyter Notebook 设置
#imports
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import numpy as np
import pandas as pd
# qtconsole for debugging
#%qtconsole -- style vim
# Notebook settings
init_notebook_mode(connected=True)
# Some sample data
x = np.random.normal(50, 5, 500)
binned = np.histogram(x, bins=25, density=True)
plot_y = np.cumsum(binned[0])
# Line
trace1 = go.Scatter(
x=binned[1],
y=plot_y,
mode='lines',
name="X",
hoverinfo='all',
line=dict(color = 'rgb(1255, 0, 0)', shape='hvh'
)
)
data = [trace1]
# Layout
layout = dict(title = 'Binned data from normal distribution',
legend=dict(
y=0.5,
traceorder='reversed',
font=dict(
size=16
)
)
)
# Make figure
fig = dict(data=data, layout=layout)
# Plot
iplot(fig, filename='line-shapes')
我希望这是你可以使用的东西!
如果没有,请随时告诉我。
一些细节:
数据样本是使用np.random.normal()
制作的。 x
是均值 = 50、sigma = 5 和 500 个观测值的抽样正态分布。 x
然后使用 np.histogram()
和 returns 两个数组放入 50 个 bin 中。这些用作绘图的数据源。
可能的替代方法:
我还尝试将您的代码段与一些随机样本数据一起使用,并将 shape='hvh'
包含在您的 line=dict(color="red", width=1)
中。但这似乎没有用。我还考虑过修改 go.Histogram()
的布局,以便只绘制条形图的顶行,但我认为这是不可能的。
可接受的解决方案可行,但可能会受到限制,因为垃圾箱的宽度都相等。一种方法是使用 matplotlib 计算统计数据,然后使用 plotly 进行绘图:
# sample data
# I am not using a normal distribution on purpose so that the effect of varying bin widths is apparent.
x = np.random.rand(100)
# use matplotlib to get "n" and "bins"
# n_bins will affect the resolution of the cumilative histogram but not dictate the bin widths.
n_bins = 100
n, bins, patches = plt.hist(x, n_bins, density=True, histtype='step', cumulative=-1)
# use plotly (v3) to plot
data = []
trace = go.Scatter(
x=bins,
y=n,
mode='lines',
name= "test",
line=dict(
shape='hvh'
)
)
data.append(trace)
fig = go.Figure(data=data)
iplot(fig)
结果应该是这样的: