Python数据分析:基于Plotly的动态可视化绘图
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.6 柱状图

2.6.1 基本柱状图

使用Plotly绘制基本柱状图最重要的函数是graph_objs中的Bar函数,通过传递数据,可以设置柱状图的样式。在Layout中对barmode进行设置可以绘制出不同类型的柱状图。如图2-15所示是柱状图最简单的实现,见文件2.6_BarChart_1.py,该案例包括使用Bar函数传递数据和变量,以及在Layout中设置标题、x轴范围。

图2-15 基本柱状图

        # 2.6-1 基本案例
        import plotly as py
        import plotly.graph_objs as go
        pyplt = py.offline.plot
        # Trace
        trace_basic = [go.Bar(
                  x = ['Variable_1', 'Variable_2', 'Variable_3', 'Variable_4',
    'Variable_5'],
                  y = [1, 2, 3, 2, 4],
            )]

        # Layout
        layout_basic = go.Layout(
                  title = 'The Graph Title',
                  xaxis = go.XAxis(range = [-0.5,4.5], domain = [0,1])
            )

        # Figure
        figure_basic = go.Figure(data = trace_basic, layout = layout_basic)

        # Plot
        pyplt(figure_basic, filename='tmp/Basic_BarChart.html')

2.6.2 柱状簇

除基本柱状图外,还有柱状簇,在基本柱状图代码的基础上加入多组数据即可实现柱状簇。图2-16所示为国际贸易板块中广东明珠、五矿发展与上海物贸这3只股票从2016年第三季度到2017年第一季度的净资产收益率(%)变化,数据来源是同花顺。

图2-16 国际贸易板块净资产收益率的对比

本案例见文件2.6_BarChart_2.py。从纵向看,上海物贸三个季度的数据分别为4.12、3.65和2.15;从横向看,data1中的数据y = [4.12, 5.32, 0.60]是3只不同股票对应的资产收益率,通过这种配置数据的方式可以对柱状簇图进行实现。本案例通过柱状簇图对比了2016年第三季度、2016年第四季度与2017年第一季度3个不同时间段同一只国际贸易板块股票的资产收益率,而且对同一时间段不同股票的资产收益率的差异也进行了展示。

本案例的代码如下。

    # 2.6-2 应用案例
    import plotly as py
    import plotly.graph_objs as go
    pyplt = py.offline.plot
    # Traces
    trace_1 = go.Bar(
              x = ["上海物贸", "广东明珠", "五矿发展"],
              y = [4.12, 5.32, 0.60],
              name = "201609"
        )

    trace_2 = go.Bar(
              x = ["上海物贸", "广东明珠", "五矿发展"],
              y = [3.65, 6.14, 0.58],
              name = "201612"
        )
        trace_3 = go.Bar(
                  x = ["上海物贸", "广东明珠", "五矿发展"],
                  y = [2.15, 1.35, 0.19],
                  name = "201703"
            )

        trace = [trace_1, trace_2, trace_3]

        # Layout
        layout = go.Layout(
                  title = ’国际贸易板块净资产收益率对比图’
            )

        # Figure
        figure = go.Figure(data = trace, layout = layout)

        # Plot
        pyplt(figure, filename='tmp/BarChart_1.html')

2.6.3 层叠柱状图

层叠柱状图的绘制与柱状簇图的绘制大同小异,相当于对同一簇的柱状图进行叠加,实现的方式是对Layout中的barmode属性进行设置,即设置barmode='stack',其余参数与柱状簇图相同。图2-17所示的层叠柱状图展示了华夏新经济混合、华夏上证50、嘉实新机遇混合、南方消费活力混合和华泰柏瑞这5只基金的资产配置比例,数据来源是和讯网。

图2-17 基金资产配置比例图

该案例见文件2.6_BarChart_3.py,通过设置barmode属性实现柱状图的层叠。通过层叠柱状图可以很清楚地看出不同基金的资产配置情况,如华夏新经济混合、华夏上证50、华泰柏瑞这3只基金有很大的股票投资权重。通过观察同一只基金的资产配置比例,可以对其风险属性有更具体的了解。

该案例的代码如下。

        # 2.6-3 应用案例
        import plotly.plotly as py
        import plotly.graph_objs as go
        pyplt = py.offline.plot

        # Data
        data_1 = go.Bar(
            x = [’华夏新经济混合’, ’华夏上证50', ’嘉实新机遇混合’, ’南方消费活力混合’, '
    华泰柏瑞’],
            y = [0.7252, 0.9912, 0.5347, 0.4436, 0.9911],
            name = ’股票投资’
        )

        data_2 = go.Bar(
            x = [’华夏新经济混合’, ’华夏上证50', ’嘉实新机遇混合’, ’南方消费活力混合’, '
    华泰柏瑞’],
            y = [0.2072, 0, 0.4081, 0.4955, 0.02],
          name=’其他投资’
      )

      data_3 = go.Bar(
          x = [’华夏新经济混合’, ’华夏上证50', ’嘉实新机遇混合’, ’南方消费活力混合’, '
  华泰柏瑞’],
          y = [0, 0, 0.037, 0, 0],
          name=’债券投资’
      )

      data_4 = go.Bar(
          x = [’华夏新经济混合’, ’华夏上证50', ’嘉实新机遇混合’, ’南方消费活力混合’, '
  华泰柏瑞’],
          y = [0.0676, 0.0087, 0.0202, 0.0609, 0.0087],
          name=’银行存款’
      )

      data = [data_1, data_2, data_3, data_4]

      # Layout
      layout = go.Layout(
          title = ’基金资产配置比例图’,
          barmode='stack'
      )
      # Figure
      fig = go.Figure(data=data, layout=layout)
      py.iplot(fig, filename='tmp/stacked-bar')

2.6.4 瀑布式柱状图

瀑布式柱状图是层叠柱状图的一种衍生,通过选择性地显示层叠部分来实现柱状图的悬浮效果。如图2-18所示的瀑布式柱状图展示了万科A股票在2016年的资产负债结构,其中非流动负债与所有者权益柱状图的悬浮效果通过设置trace0中的y值实现,如y=[0,57999848,0,66899764,0],表示第1、3、5根柱状图从0开始显示,第2根柱状图从57999848开始显示,第4根柱状图从66899764开始显示,实现的方式是将trace1所表示的柱形颜色设置为白色,即color='rgb(255, 255, 255)',起到选择性显示的效果,见文件2.6_BarChart_4.py。

图2-18 万科A股票资产负债结构

该案例的代码如下。

        # 2.6-4 应用案例
        import plotly as py
        import plotly.graph_objs as go
        pyplt = py.offline.plot

        x_data = [’流动负债’, ’非流动负债’,
                '负债’, ’所有者权益’, ’总资产’]
        y_data = [56000000, 65000000, 65000000, 81000000, 81000000]
        text = ['57,999,848万元’, '8,899,916万元’, '66,899,764万元’, '16,167,657
    万元’, '83,067,421万元’]

        # Base
        trace0 = go.Bar(
            x=x_data,
            y=[0, 57999848, 0, 66899764, 0],
            marker=dict(
              color='rgb(255, 255, 255)',
            )
        )
        # Trace
        trace1 = go.Bar(
            x=x_data,
            y=[57999848, 8899916, 66899764,16167657, 83067421],
            marker=dict(
              color='rgba(55, 128, 191, 0.7)',
              line=dict(
                  color='rgba(55, 128, 191, 1.0)',
                  width=2,
              )
            )
        )

        data = [trace0, trace1]
        layout = go.Layout(
            title = ’万科A资产负债结构图’,
            barmode='stack',
            showlegend=False
        )

        annotations = []
        for i in range(0, 5):
            annotations.append(dict(x=x_data[i], y=y_data[i], text=text[i],
                                      font=dict(family='Arial', size=14,
                                      color='rgba(245, 246, 249, 1)'),
                                      showarrow=False, ))
            layout['annotations'] = annotations

        fig = go.Figure(data=data, layout=layout)
        pyplt(fig, filename = 'tmp/waterfall-bar-profit.html')

2.6.5 图形样式设置

对柱状图颜色与样式的设置通过下面这个案例来说明。图2-19所示的柱状图展示了有色金属板块AU、AG、SN、PB和CU这5种合约在某一个交易日的最高涨幅与波动率,柱形的宽度表示相对波动率的高低,柱形越宽,波动率越大;高度表示涨幅,红色柱状图突出了涨幅上升的商品期货,绿色柱状图突出了涨幅下跌的商品期货。

图2-19 有色金属板块主力合约日内最高涨幅与波动率图

本案例见文件2.6_BarChart_5.py,包括设置柱状图的颜色样式、用line设置柱状图外围的框线、用width设置柱状图的宽度、用opacity设置柱状图颜色的透明度,以及设置Layout中的xaxis令x轴的标记旋转-45°。

本案例的代码如下。

        # 2.6-5 应用案例
        import plotly as py
        import plotly.graph_objs as go
        pyplt = py.offline.plot

        # Customizing Individual Bar Colors
        volume = [0.49,0.71,1.43,1.4,0.93]
        width = [each*3/sum(volume) for each in volume]
        trace0 = go.Bar(
            x = ['AU.SHF', 'AG.SHF', 'SN.SHF',
              'PB.SHF', 'CU.SHF'],
            y = [0.85, 0.13, -0.93, 0.46, 0.06],
            width = width,
            marker = dict(
              color=['rgb(205,38,38)', 'rgb(205,38,38)',
                      'rgb(34,139,34)', 'rgb(205,38,38)',
                      'rgb(205,38,38)'],
              line=dict(
                  color='rgb(0,0,0)',
                  width=1.5,
              )),
              opacity = 0.8,
        )

        data = [trace0]
        layout = go.Layout(
            title = ’有色金属板块主力合约日内最高涨幅与波动率图’,
            xaxis=dict(tickangle=-45),
        )

        fig = go.Figure(data=data, layout=layout)
        pyplt(fig, filename='tmp/highlight-bar.html')

2.6.6 应用案例

经过对前面案例的学习,读者对柱状图的绘制已经很清楚了,在实际运用时,往往需要从dataframe中获取高频金融数据进行可视化,下面的案例讲解从导入CSV文件到做出成交量柱状图的过程,更加贴近现实中的应用,运行结果如图2-20所示,见文件2.6_BarChart_6.py。

图2-20 成交量柱状图

本案例的代码如下。

    # 2.6-6 应用案例
    import plotly as py
    import plotly.graph_objs as go

    pd.set_option('display.width', 450)
    pyplt=py.offline.plot
    df=pd.read_csv('dat/tk01_m15.csv')
    df2= df[:10]; print(df9)
    xtr = go.Bar(
        x=df2['time'],
        y=df2['volume'],

    )
    xdat = go.Data([xtr])
    layout = go.Layout(
        title = ’成交量volume--15分钟分时数据’,
          xaxis = go.XAxis(tickangle=-15),
      )
      fig = go.Figure(data=xdat, layout=layout)
      pyplt(fig)

2.6.7 参数解读

本小节对绘制柱状图所需Bar函数的常用参数进行详细讲解,包括设置柱状图所需的数据和属性,常用参数如下。

●base:柱状图的起始参数。

●dx、dy:xy坐标轴的步进值,默认值是1。

●error_x、error_y:xy出错信息。

●hoverinfo:当用户与图形互动时,鼠标指针显示的参数,包括xyz坐标数据,以及text(文字信息)和name(图形名称)数据等参数的组合,使用+、all、none和skip(忽略)作为组合连接符号,默认是all(全部显示)。

●insidetextfont:内置文本的字体格式参数。

●legendgroup:图标参数,默认是空字符串。

●marker:数据节点参数,包括大小、颜色、格式等。

●name:名称参数。

●offset:坐标位移参数。

●opacity:透明度参数,范围是0~1。

●orientation:图形显示方向参数,包括v(垂直模式)和h(水平模式)。

●outsidetextfont:外置文本的字体参数。

●rsrc、xsrc、ysrc、textsrc、textpositionsrc、offsetsrc、basesrc、widthsrc:字符串源数组列表,作为Plotly网格标识符,用于设置一些特殊图表所需的r参数、x参数、y参数、text(文本)参数、textposition(文本位置)参数、offset(位移)参数、base(起点)参数、width(宽度)参数。

●r、t:仅用于极坐标图,r用于设置径向坐标(半径),t用于设置角坐标。

●showlegend:布尔变量,用于切换图标显示。

●stream:数据流,用于实时同步数据图表。

●textfont:文本字体参数,包括字体名称、颜色、大小等。

●textposition:“文本”元素的位置参数,包括top left(左上)、top center(中上)、top right(右上)、middle left(左中)、middle center(中心)、middle right(右中)、bottom left(左下)、bottom center(中下)、bottom right(右下)模式。默认是middle center(中心)模式。

●text:文本数据,设置与每个“(x, y)对”关联的文本元素,数组列表格式,默认是空字符串。

●type:数据显示模式参数,包括constant(常数)、percent(百分比)、sqrt(平方根)和array(数组)。

●visible:布尔变量,切换图形显示开关。

●width:柱状图的条形宽度。

●x0、y0:坐标轴起点坐标。

●xaxis、yaxis:xy坐标参数。

●xcalendar、ycalendar:坐标时间参数格式,默认是公历(gregorian)。

●x、y: x、y轴的坐标数据。