nvd3柱状图制作

最近初次接触D3.jsnvd3.js。尝试过更改一些例子,再结合官方的文档以及网上一些教程,对D3.js学习越多越感受它的强大,也明白了为什么说D3.js不单单是一个制作图表的库,而是一个直接操作DOM的强大的工具。

基于D3.jsnvd3.js提供了一些基础图表的接口,是一个可复用的D3图表库。支持饼图,柱状图,折线图等。好处是,比起直接使用D3.js创建图表,需要写的代码会少一些。限制是,有些种类的图表目前nvd3.js还不支持,比如雷达图等。

这次使用的是npm安装的zombiej-nvd3 ,版本1.8.2-3

官方API中给出的少数方法有的并不好用,甚至也没有描述如何调用,但是文档还是很大的帮助。
Nvd3 文档
Nvd3 Github Repo

另外,因为D3.js是绘制的svg,所以也需要了解一下svg的结构。

nvd3柱状图制作

渐变色

svg的渐变色不能使用CSS中的linear-gradient方式。而是要定义fill属性。具体做法可以参考:svg教程:渐变

所以我们想只在图表的色板中添加一个渐变色是行不通的。或者使用接口 barColor(详见文档)直接定义柱状图的颜色也是不行的。

首先我们需要像上面的svg教程中说到的那样,在svg元素中添加defs标签,然后自定义 linearGradient

//定义渐变色
if($(_chartCntr).find('#linear-gradient').length === 0){    //如果还没有定义过渐变色
var linearColor = d3.select(_chartCntr).append('defs')
    .append('linearGradient')
    .attr('id','linear-gradient')
    .attr('x1','0%')
    .attr('x2','0%')
    .attr('y1','0%')    //纵向渐变
    .attr('y2','100%');
//定义渐变的起始和终止颜色
linearColor.append('stop')
    .attr('offset',"0%")
    .attr('stop-color','rgba(0,122,225,0.90)');
linearColor.append('stop')
    .attr('offset',"100%")
    .attr('stop-color','rgba(0,122,225,0.00)');   
}

之后再按照教程设置柱状图的fill为 url(#linear-gradient)就可以了(直接操作rect节点,或者使用nvd3的颜色接口)。

圆角

设置rect标签的属性rxry就可以。

$(_chartCntr).find('.nv-bar').attr('rx', 10);

自定义tooltip

nvd3的图表都是有tooltip组件的。比如创建柱状图使用的 MultiBarChart

nvd3文档-multiBarChart

所以定制tooltip也很简单了。比如更改tooltip的内容:

//自定义tooltip
_chart.tooltip
    .contentGenerator(function (data) {
        var str = '<table><thead><tr><td><strong>' + data.value + '</strong></td></tr></thead>';
        if(data.series.length !== 0) {
            str = str + '<tbody><tr><td height ="10px"></td></tr>';
            data.series.forEach(function(d){
                str = str + '<tr></td><td class="key">' + d.key + ': </td><td class="value">' + d.value + '</td></tr>';
            }); 
        str = str + '</tbody>';
        }
        str = str + '</table>';
        return str;
    });

更多的操作可以查看官方文档中的Tooltip提供的方法。

自定义legend

默认的图例是靠右的。改为向左对齐,并设置margin:

//定义图例的位置等
_chart.legend
    .rightAlign(false)  //图例左对齐
    .margin({"top":5,"bottom":20}); //图例上下margin

另外,尝试使用align('left')不起作用,而且文档中对这个方法没有任何描述。所以试了rightAlign(false),然后就真的居左啦。

修改Y轴范围

使用MultiBarChart 创建的柱状图默认Y轴刻度并不是从0开始,而是从数据的最小值开始,所以最小值的柱子不会显示。在数据比较少的时候不太美观。

使用forceY方法不起作用。Github上有人提出这个问题,应该是还没有解决。forceY for the multiChart model #161

换了一个办法,使用yDomain设置y轴的值域。使用方法:

 nv.models.multiBarChart()
    .yDomain([最小值, 最大值])    //设定y轴值域
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容