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:x、y坐标轴的步进值,默认值是1。
●error_x、error_y:x、y出错信息。
●hoverinfo:当用户与图形互动时,鼠标指针显示的参数,包括x、y、z坐标数据,以及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:x、y坐标参数。
●xcalendar、ycalendar:坐标时间参数格式,默认是公历(gregorian)。
●x、y: x、y轴的坐标数据。