密谋:如何绘制累积的“步长”直方图?

时间:2019-03-18 12:03:43

标签: python histogram plotly plotly-python

我正在尝试在python中使用Plotly绘制累积直方图,但使其看起来像“台阶”,即没有颜色的条形图仅显示顶行。像这样:

enter image description here

基本上,我正在尝试重现以下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])

结果如下:
enter image description here

那有什么窍门?

2 个答案:

答案 0 :(得分:3)

可接受的解决方案有效,但可能会受到限制,因为垃圾箱的宽度均相等。一种方法是使用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)

结果应如下所示: enter image description here

答案 1 :(得分:2)

如果您愿意在绘制数据之前 进行装仓和累加,则可以使用go.Scatter对象,其线的shape属性设置为{{1} }。

情节:

enter image description here

代码:Jupyter Notebook的设置

'hvh'

我希望这是您可以使用的东西!

不要犹豫,让我知道。

一些详细信息:

使用#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 debugginh #%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()是样本正态分布,均值= 50,sigma = 5和500个观测值。然后使用xx放入50个纸槽中,这将返回两个数组。这些用作绘图的数据源。

可能的替代方法:

我还尝试将您的代码段与一些随机样本数据一起使用,并将np.histogram()包含在您的shape='hvh'中。但这似乎没有用。我还考虑过修改line=dict(color="red", width=1)的布局,以便只绘制条的顶线,但我认为这是不可能的。