当使用plotly + cufflinks时,如何使用DataFrame中多个直方图的特定列表列表?

时间:2017-08-20 16:49:41

标签: pandas histogram plotly

在使用matplotlib绘制直方图时手动提供容器列表相对容易,如示例here所示。

以下是一个简单的例子:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.hist(np.random.randn(10000), bins=np.arange(-4, 4, 0.1))
ax.hist(0.2 * np.random.randn(10000), bins=np.arange(-4, 4, 0.1))
plt.show()

这也可以通过pandas.DataFrame

等效地完成
pd.DataFrame({
    'firstHistogram': np.random.randn(10000),
    'secondHistogram': 0.2 * np.random.randn(10000)
}).plot(kind='hist', bins=np.arange(-4, 4, 0.1))

更进一步,plotly允许通过pandas模块直接与cufflinks接口,允许执行以下操作:

pd.DataFrame({
    'firstHistogram': np.random.randn(10000),
    'secondHistogram': 0.2 * np.random.randn(10000)
}).iplot(kind='hist', bins=100)

enter image description here

但是这里有一个问题:iplot提供的cufflinks方法似乎不接受bins的列表。 当提供一个数字时,如上例所示,该数字用于独立地存储两个数据集,这导致不相等的分级,可能会产生误导性结果(参见上图中的相等高度)。

虽然使用histnorm='density'选项可以稍微减轻这种影响,但人们可能希望看到每箱的计数而不是密度。

有解决方法吗?

2 个答案:

答案 0 :(得分:5)

我已为此添加了更新。 您现在应该可以指定pd.DataFrame({ 'firstHistogram': np.random.randn(10000), 'secondHistogram': 0.2 * np.random.randn(10000)}).iplot(kind='hist',bins=(-4,4,.08))

Set wz3= Workbooks("Book1")
wz3.Worksheets("Sheet1").Range("A:G").Clear

现在应该返回: Custom bins

答案 1 :(得分:2)

据我所知,袖扣中没有直接的方式。在我看来,你的代码中显示的输出是错误的,即我认为这是袖扣中的一个错误。

但是您可以使用几行代码轻松模仿袖扣功能。您可以使用cufflinks.getLayout()获得相同的布局,只需将barmode设置为overlay

enter image description here

import pandas as pd
import plotly
import cufflinks

plotly.offline.init_notebook_mode()

pd.DataFrame({
    'firstHistogram': np.random.randn(10000),
    'secondHistogram': 0.2 * np.random.randn(10000)
})

data = list()

for dd in df:
    histo = plotly.graph_objs.Histogram(x=df[dd], 
                                        name=dd,
                                        xbins={'start': -4, 'end': 4, 'size': 0.08},
                                        autobinx=False, 
                                        opacity=0.8
                                       )
    data.append(histo)
layout = plotly.graph_objs.Layout(cufflinks.getLayout(), 
                                  barmode='overlay')
fig = plotly.graph_objs.Figure(data=data, 
                               layout=layout)
plotly.offline.iplot(fig)