在曾经的博客时代,标签云十分流行,通过一堆大小不同的文字标示出相关主题的热度。气泡云图与此有类似的目的,通过气泡的大小展示相关主题的宏观对比。
气泡云图与气泡图有很大的差别,气泡图需要三个维度,而气泡云图只需要两个变量:主题和主题对应的数值。
这里是一个气泡云图的示例,用于展示某部门员工的业绩(是不是感觉很直观!!!):
ECharts、Highcharts都没有提供这种图表展现形式(或者是我没找到?)。
这个图表使用了D3进行制作,D3全称为Data-Driven Document,是一个提供数据可视化的Javascript库,它实际上不进行图表的渲染,只是将数据与页面元素进行连接。
下边就来看如何实现:
1、首先定义一个html页面
在页面中需要引用d3库,这里直接添加到head中了。
<html> <head> <script src="https://d3js.org/d3.v3.min.js" type="text/javascript"></script> </head> <body> <h1>D3 Bubble Chart</h1> <section id="graph"></section> </body> </html>
2、然后就是重点部分了
通过调用d3 API将测试数据绘制成图表,这里尽量注释详细点。
(function() { // 要展现的数据,name为主题名称,className为气泡的样式,size将用于气泡大小 var dataSet = []; dataSet.push({name: '张三', className: 'item0', size: 2540}); dataSet.push({name: '李四', className: 'item1', size: 1234}); dataSet.push({name: '王五', className: 'item2', size: 456}); dataSet.push({name: '猴六', className: 'item3', size: 200}); dataSet.push({name: '姓赵的', className: 'other', size: 980}); // 将数据包装下层次 var json = {children: dataSet} // 图形区域大小 var diameter = 600; // 在id=graph的section创建SVG区域 var svg = d3.select('#graph').append('svg') .attr('width', diameter) .attr('height', diameter); // 用递归的圆-包生成一个层次布局,建议取消sort注释看看 var bubble = d3.layout.pack() .size([diameter, diameter]) .value(function(d) {return d.size;}) // .sort(function(a, b) { // return -(a.value - b.value) // }) .padding(3); // 计算包布局并返回节点数组 var nodes = bubble.nodes(json) .filter(function(d) { return !d.children; }); // 绑定气泡元素和数据 var vis = svg.selectAll('g').data(nodes); // 定义气泡 var node = vis.enter().append("g") .attr("class", "node") .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); // 画气泡(圆圈) node.append("circle") .attr("r", function(d) { return d.r; }) //圆的半径 .attr('class', function(d) { return d.className; }); //圆的颜色 // 设置气泡(圆圈)上的文字 node.append("text") .selectAll("tspan") // text下的文字用tspan包裹,这里将创建两个 .data(function(d) { return [d.name,d.size]; }) // text下的两行文字数据:主题名称和数据大小 .enter().append("tspan") // 这里会创建两个tspan .attr("x", function(d, i) { // 文字的水平位置,大代表当前tspan文字内容 if(isNaN(d)){ return 0-(d.length/2)*12; }else{ return 0-(d.toString().length/2)*6; // 数字字符的宽度短一些 } }) .attr("y", function(d, i) { // 文字的垂直位置,i代表第几个tspan return 8 + i * 18; }) .text(function(d) { return d; }); // 文字的内容 // 鼠标划过显示 node.append("title") .text(function(d) { return d.name+"\n"+d.size; }); })();
这里使用了一些静态测试数据,根据自己的需求修改dataSet就可以了。
数据中定义了一个className项,这个主要用于定义气泡的颜色,对于动态的数据,特别是数据量不好预估的情况,可以使用动态计算色值的方法,或者循环、随机从一组色值中选取。
绘制气泡的部分也可以增加直接设置气泡颜色的脚本,比如:
// 画气泡(圆圈) node.append("circle") .attr("r", function(d) { return d.r; }) //圆的半径 .style("fill", function(d) { return '#aabbcc'; }); //圆的颜色
理解了相关脚本,用起来还是很简单的。
点击这里下载完整示例。
关键字: 气泡云图
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论