如何使用plotly和python在条形图中将xaxis中的bin组合起来?

时间:2015-08-03 15:27:35

标签: python plotly

如何使用plotly和python在条形图中将xaxis中的bin组合在一起?

以下是我的尝试:

data3 = Data([
    Bar(
        x=[x[0] for x in lv_list],
        y=[(y[1]/lc_dict[y[0]]) for y in lv_list]
    )
])
layout3 = dict(
   title='Public Highlight Analysis',
   yaxis=YAxis(
       title = 'Average Number of Views'),
   xaxis1=XAxis(
       title = "Duration of Highlight in Seconds",
        autotick=False,
        dtick=50, range = [0,10000])
   )
fig3 = Figure(data=data3, layout=layout3)
py.iplot(fig3)

enter image description here

我想做什么:

我希望图表能够合并1-1000,1001-2000,2001-3000等数字,以便沿轴有6个分档。

1 个答案:

答案 0 :(得分:1)

不确定你的意思"结合",但这里有几个可能的解决方案。

示例数据:

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [2, 1, 6, 3, 7, 9, 2, 12,5, 3]
s = ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'E', 'F']

1 - 如果您只想显示更少的刻度线,请在dtickhttps://plot.ly/python/reference/#XAxis)内使用xaxis

以下是默认视图:

>> py.iplot([Bar(x=x, y=y)])

Default bar chart

此处,使用自定义dtick

iplot({
    'data': [
        Bar(x=x, y=y)
    ], 
    'layout': {
        'xaxis': {
            'dtick': 3
        }
    }
})

Display a tick every 3 items with <code>dtick</code>

2 - 如果您希望按频率分类项目,请使用直方图(more histogram examples

py.iplot([Histogram(y=y)])

Simple histogram

3 - 如果您希望对项目进行分箱和求和,请考虑使用Pandas:

>> import pandas as pd
>> df = pd.DataFrame({'x': x, 'y': y, 's': ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'E', 'F']})
>> df

   s   x   y
0  A   1   2
1  B   2   1
2  C   3   6
3  D   4   3
4  A   5   7
5  B   6   9
6  C   7   2
7  D   8  12
8  E   9   5
9  F  10   3

使用groupbysum对属于同一类别的所有商品进行存储和汇总

>> s = df.groupby('s').sum()
>> s
    x   y
s        
A   6   9
B   8  10
C  10   8
D  12  15
E   9   5
F  10   3
>> py.iplot([Bar(x=s.index, y=s.y)])

binned bar chart example

如果您的数据是数字,并且您想要对值进行合并和求和,那么请自行创建数字分箱并绘制结果:

>> import numpy as np
>> bins = np.linspace(df.x.min(), df.x.max(), 5)
>> print bins
[  1.     3.25   5.5    7.75  10.  ]
>> df['groups'] = np.digitize(df.x, bins)
>> print df

   s   x   y  groups
0  A   1   2       1
1  B   2   1       1
2  C   3   6       1
3  D   4   3       2
4  A   5   7       2
5  B   6   9       3
6  C   7   2       3
7  D   8  12       4
8  E   9   5       4
9  F  10   3       5

>> grouped = df.groupby('groups').sum()
>> print grouped
         x   y
groups        
1        6   9
2        9  10
3       13  11
4       17  17
5       10   3

>> bin_boundaries = [_ - 0.5 for _ in range(len(grouped.y))]
>> py.iplot({
       'data': [Bar(y=grouped.y)],
       'layout': {
           'bargap': 0,
           'xaxis': {
               'ticktext': bins,
               'tickvals': bin_boundaries
           }
       }
   }, validate=False)

Grouped and binned bar chart