D3之图表中的legend

一、group的应用

group可以理解为div、它常常用在对一个大型的图表分模块。例如:对于一个图表,它可能有:图表主题、图标的解释说明、图标的legend、图标的axis。那么每个模块我们可以认为是一个组,用group包裹起来。

二、color的应用

var colors = d3.scale.category10() //定义一个有10种颜色的函数,通过color(i)取得每个颜色值

三、制作legend

3.1 分解legend

一个legend可以分解为:绘制不同颜色的rect、绘制每项对应的文字描述

3.2分析如何实现

对于legend是一个group,由于legend的每一项包含rect、text.因此legend的每项也是一个group

3.3 legend中的难点

对于legend有一个重点,legend中的每一项的文字长度有可能是不一样的,那么我们在制作legend时,一定要根据具体的字数计算该移动多少。

四、代码实现

4.1 数据初始化

var self = this,
    data = ['这个那个这个',20,30],
    newData = [],
    width = 0,
    rectWidth = 25,
    rectPadding = 5, 
    rectHeight = 18,
    gMargin = 15;
this.fontSize = '12px';
Talent.$.each(data,function(index,item){
                var obj = {}
                obj.value = item
                obj.width = width;
                width = width + self.calculateWidth(item)+rectWidth+rectPadding+gMargin;
                newData.push(obj);
})//这里我用了jQuery的each

其中最后的处理数据是最关键的
4.2 绘制每个group

var lableGrops = svg.selectAll('.lableGroup').selectAll('g')
                    .data(newData)
                    .enter()
                    .append('g') 
                    .attr({
                        'transform':function(d,i){
                            var x = d.width;
                            return 'translate('+[x,rectHeight/2]+')'
                        }
                    })

其中计算每个分组应该移动的的距离最关键
4.3 绘制rect和text

lableGrops.append('rect')
          .attr({
                 'width':rectWidth
                ,'height':rectHeight
                ,'x':0
                ,y:-(rectHeight/2)
                ,'rx':5
                ,'ry':5
                ,fill:function(d,i){
                      return color(i);
                 }
           })
lableGrops.append('text')
          .attr({
                 x:rectWidth+rectPadding
               ,'alignment-baseline':'middle'
               ,fill:'black'
          })
         .text(function(d,i){
                    return d.value;
          })
         .style({
                   'font-size':self.fontSize
          })

注意的要点:
在group中,我们绘制的一切都是以group来计算的。这样一来我们只管绘制group中的东西,最后关心group何如显示就可以。
4.4 计算width

calculateWidth:function(text){
    var self =  this;
    var sensor = Talent.$('<pre>' + text + '</pre>').css({
                 'display': 'none'
                   ,'font-size':self.fontSize
    });
    Talent.$('body').append(sensor);
    var width = sensor.width();
    sensor.remove();
    return width;
}

五、看图

QQ图片20141103143901.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,858评论 0 17
  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 10,195评论 2 32
  • 《怪化猫》 以其独特的浮世绘画风和华丽的视觉效果倍受好评。 故事大概为:镇上发生了奇怪的事件。在慌乱的村民面前出现...
    三木科阅读 3,003评论 2 0
  • 今天参加了一个婚礼,新娘24岁,恍惚了一下,哦,好像我也是24岁哦。 24岁是女生还是女人?嗯 随便吧,只是突然好...
    茶言阅阅读 3,474评论 0 0
  • 今天又是阳光明媚的一天,下午参加了苏州的一个演讲俱乐部的拓展活动,夜宿吴江同里。 同里古镇有处著名的三桥景区。所...
    保罗杨阅读 2,778评论 0 1

友情链接更多精彩内容