使用bokeh-scala进行数据可视化(2)
目录
一、前言
之前已经简单介绍过一次如何使用Bokeh-scala进行数据可视化(见使用bokeh-scala进行数据可视化),以及如何在Geotrellis中进行分布式下的空间数据可视化(见geotrellis使用(十五)使用Bokeh进行栅格数据可视化统计),但是之前介绍的只是简单的线、圆圈等可视化方式,本文位大家介绍几种高级的可视化图表。
二、几种高级可视化图表
整体上与第一篇Bokeh-scala文章中介绍的方式相同,主要是完善了BokehHelper类,我已经将所有代码放在Github中(见https://github.com/wsf1990/bokehscala)。
2.1柱状图
柱状图主要是创建一个Quad对象,代码如下:
val quad = new Quad().left(left).right(right).bottom(bottom).top(top).fill_color(fill_Color).line_color(line_Color)
其中left表示左边柱状图的每一根柱子的左侧x数据,right表示右侧x数据,top表示上侧y数据,bottom表示下侧y数据,理论上最好取每个right值为下一个的left值,这样整个柱状图刚好能左右衔接在一起。当然如果只有光秃秃的“柱子”没有任何说明也完全不能表达出柱状图的效果,我们可以使用Text类来创建文本对象添加到“柱子”的上方,代码如下:
val textPosition = column(left.value.map(_ + 0.4))
BokehHelper.setTextGlyph(plot, textPosition, top, text, source)
其中textPosition为文本显示的左侧位置,这里采用“柱子”左侧值加0.4的结果,这样就可以得到一个漂亮的柱状图。text图元会在下面详细介绍。效果如下图:
2.2饼状图
饼状图主要是创建一个AnnularWedge对象,代码如下;
val annularWedge = new AnnularWedge().x(x).y(y).inner_radius(innerRadius).outer_radius(outerRadius).start_angle(startAngle).end_angle(endAngle).fill_color(Color.Blue).line_color(Color.Red).direction(Direction.Clock)
其中x为饼状图显示的x坐标,y为饼状图显示的y坐标,inner_radius为内圆半径,outer_radius为外圆半径,start_angle为起始角度,end_angle为结束角度,direction为圆弧的方向。其中inner_radius、outer_radius、start_angle、end_angle均可以是序列或单个值,如果是单个值表示每一个“饼”采用相同的值,如果是序列表示每一个“饼”采用不同的值。此处需要注意的是0度位置为水平向右,最大值为2π,最小值为-2π,逆时针方向,所以一般情况应当是start_angle对应的值小于end_angle对应的值,当然可以通过设置direction的值为Direction.Clock来改变角度大小对应关系(direction的值默认为Direction.AntiClock),而且在实际测试中我发现当direction设置为Direction.AntiClock时,将不会有任何内容的图表产生,此处应当是个BUG。
同理我们此处也可以为每个“饼”添加一个文本标记用以区分,此处稍有不同的是由于标记是在一个圆圈周围,需要根据三角函数来计算文本的x、y值,并为文本设置对应的角度。代码如下:
val textAngle = column(startAngle.value.map(_ + 0.3 / 2))
val text_x = column(textAngle.value.map(6 * Math.cos(_)))
val text_y = column(textAngle.value.map(6 * Math.sin(_)))
println(text_x.value)
println(text_y.value)
BokehHelper.setTextGlyph(plot, text_x, text_y, text, source, angle = textAngle)
由于我的测试数据为结束角度比起始角度大0.3所以文本角度取起始角度加0.15使其刚好在每个“饼”的中间位置。text_x就是根据每一个角度计算cos值并乘以外圆半径,text_y就是根据每一个角度计算sin值并乘以外圆半径,最终并为text对象赋一个角度angle。text图元象的实现代码如下:
val text = new Text().x(x).y(y).text(t).angle(angle)
其中x为显示的x坐标,y为显示的y坐标,text为显示的文本内容,angle为文本角度,x、y、t、angle均为序列值,可以在图表中放置一系列的不同文本。通过以上代码就能实现一个漂亮的饼状图。效果如下图所示:
2.3区域图
这里的区域图的意思就是面积覆盖图,简单的说就是一组坐标点相连(首尾也相连)包裹起来的范围,我们先来看一下效果图。
其中每种颜色代表一个面积区域,实现区域图只需创建一个Patches对象。实现代码如下:
val xs = column(IndexedSeq[List[Double]](List(1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10), List(1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10), List(1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10)))
val ys = column(IndexedSeq[List[Double]](List(0, 8, 9, 8.8, 8.6, 8.5, 8, 9, 8.9, 9.8, 8.5, 0), List(0, 3, 5, 6, 7, 5, 4, 3, 3.6, 4.5, 5.5, 0), List(0, 1, 2, 1, 3, 2.5, 2.8, 3, 1.9, 2, 3, 0)))
val patches = new Patches().xs(xs).ys(ys).line_width(width).line_color(line_Color).fill_color(fill_Color).fill_alpha(0.8)
其中xs表示x值序列,ys表示y值序列。这里需要特别说明的是xs和ys内部又由多个List组成,这样相当于每个List对应上图中的一种颜色。xs与ys中List个数要相等,并且每个List中的元素个数也要相等,相当于每一个x坐标均对应一个y坐标,这样就会出现多组坐标首尾相连。实际中最好将每个List中的x的第一个值和最后一个值重复添加,并将对应的y值设为0,这样相当于坐标点的首和尾均在x轴上,效果会更好,并且最好将y值整体较小(或者大,取决于上述水平线的位置)的List放在后面,作用是区域叠压的时候小的区域在上部,不会被压盖住使得该区域不可视。也可以为每组List设置不同的fill_color,可以得到不同的填充效果。
2.4地图
有时候需要在地图中添加城市等坐标点信息,这个在Bokeh中也很容易实现,代码如下:
new GMapPlot().x_range(xdr).y_range(ydr).tools(tools).width(width).height(height)
val map_options = new GMapOptions()
.lat(30.2861)
.lng(-97.7394)
.zoom(2)
.map_type(MapType.Roadmap)
plot.map_options(map_options)
BokehHelper.setCircleGlyph(plot, lon, lat, source)
首先创建plot对象就与普通图表不同,这里要创建一个GMapPlot对象,然后要创建一个GMapOptions对象,用于设置地图的一些常用属性,如显示的层级以及显示的经纬度坐标等。有了GMapPlot对象,就可以像之前创建其他可视化图元那样创建在地图上的可视化图元,如点、线、面等。效果如下图所示:
当然其地图采用了Google地图,所以你可能需要做些其他操作(Over wall)才能看到。
2.5交互式信息提示
如果在鼠标移动到某个图元的时候能够动态的提示相应的信息,这样会带来很好的客户体验,在Bokeh中实现起来也很容易,只需要添加一个HoverTool的工具即可,实现代码如下:
val hover_tool = new HoverTool().tooltips(Tooltip("value" -> "@x0", "name" -> "@text"))
plot.tools := hover_tool :: new PanTool :: new WheelZoomTool :: Nil
其中tooltip为设置提示内容,这里采用键值对的方式,key为要提示的信息名称,value为要提示的信息内容,@text采用了通配符的方式,即图表会自动从为该图元赋值时的source类中寻找名为text的变量并赋值给对应的图元,这样当鼠标移动到图元中时就会得到相应的提示信息。效果如下图所示:
三、总结
以上是部分bokeh-scala数据可视化的高级图表,全部代码见https://github.com/wsf1990/bokehscala,后续还会逐步完善,小功能或BUG修改会直接推送到Github中,大的功能实现或讲解可能会重写一篇博客介绍。欢迎探讨、交流。
使用bokeh-scala进行数据可视化(2)的更多相关文章
- 使用bokeh-scala进行数据可视化
目录 前言 bokeh简介及胡扯 bokeh-scala基本代码 我的封装 总结 一.前言 最近在使用spark集群以及geotrellis框架(相关文章见http://www.cnbl ...
- Spark GraphX 的数据可视化
概述 Spark GraphX 本身并不提供可视化的支持, 我们通过第三方库 GraphStream 和 Breeze 来实现这一目标 详细 代码下载:http://www.demodashi.com ...
- 【WaaCaa】一款开源科学作图/数据可视化工具 —— 诞生篇
作为一个理工男.用过了形形色色能够用于科学作图/数据可视化软件:从大学时做实验课推荐用于分析简单採集数据的 Origin; 毕业论文时用来呈现实验时序信号和离线分析脑电信号的 MATLAB.后面还发现 ...
- 数据可视化之Matplotlib的使用
1.什么是数据可视化 数据可视化在量化分析当中是一个非常关键的辅助工具,往往我们需要通过可视化技术,对我们的数据进行更清晰的展示,这样也能帮助我们理解交易.理解数据.通过数据的可视化也可以更快速的发现 ...
- Python数据可视化基础讲解
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:爱数据学习社 首先,要知道我们用哪些库来画图? matplotlib ...
- 分形、分形几何、数据可视化、Python绘图
本系列采用turtle.matplotlib.numpy这三个Python工具,以分形与计算机图像处理的经典算法为实例,通过程序和图像,来帮助读者一步步掌握Python绘图和数据可视化的方法和技巧,并 ...
- 详解Python Streamlit框架,用于构建精美数据可视化web app,练习做个垃圾分类app
今天详解一个 Python 库 Streamlit,它可以为机器学习和数据分析构建 web app.它的优势是入门容易.纯 Python 编码.开发效率高.UI精美. 上图是用 Streamlit 构 ...
- Streamlit:快速数据可视化界面工具
目录 Streamlit简介 Streamlit使用指南 常用命令 显示文本 显示数据 显示图表 显示媒体 交互组件 侧边栏 缓存机制 Streamlit使用Hack Streamlit的替代品 相关 ...
- Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)
Webstorm+Webpack+echarts ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...
随机推荐
- hdu 5661 Claris and XOR
Claris and XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- Linux内核--网络栈实现分析(四)--网络层之IP协议(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7514017 更多请看专栏,地址 ...
- HDU4430 Yukari's Birthday(枚举+二分)
Yukari's Birthday HDU4430 就是枚举+二分: 注意处理怎样判断溢出...(因为题目只要10^12) 先前还以为要用到快速幂和等比数列的快速求和(但肯定会超__int64) 而 ...
- poj 1195 - Mobile phones(树状数组)
二维的树状数组,,, 记得矩阵的求和运算要想好在写.... 代码如下: #include <cstdio> #include <cstdlib> #include <cm ...
- 微信公共平台开发-(.net实现)5--access_token过期的问题
每次在于微信交互时,都要用到access_token,但是这个值限制的是有时间的,但是access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token ...
- ABP框架Web API跨域问题的解决方案
1.在Web Api 项目下安装 Microsoft.AspNet.WebApi.Cors 包 Install-Package Microsoft.AspNet.WebApi.Cors 2.在Web ...
- 团队项目——站立会议DAY10
第十次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:进一步完善程序代码,提出扩展性的建议,增加程序的功能. 2.钟灵毓秀:修改已完成代码出现的bug,完善代码 ...
- 解决ng界面长表达式(ui-set)
本文来自网友sun shine的问题,问题如下: 您好, 我想求教一个问题. 在$scope中我的对象名字写的特别深, 在 html中我又多次用到了同一个对象, 对不对在 html中让它绑定到一个临时 ...
- Unity3D音乐音效研究-MIDI与波表
其实音乐音效这个命题本身没什么好研究的. Unity3D提供了丰富的结构和使用方式,足够使用了. 但是我有一些小小的想法和需求,一般的Unity资料并没有给我答案. 一个是容量要小.MP3.OGG的高 ...
- [stm32] 一个简单的stm32vet6驱动2.4寸240X320的8位并口tft屏DEMO
书接上文: 最近在研究用低速.低RAM的单片机来驱动小LCD或TFT彩屏实现动画效果 首先我用一个16MHz晶振的m0内核的8位单片机nRF51822尝试驱动一个1.77寸的4线SPI屏(128X16 ...