D3绘制水平柱状图

一、前言

根据需要,Boss让你绘制水平的柱状图,左边显示昨天的数据,今天显示今天的数据。用D3画图

二、仿造数据

today.csv

name,value,unit
A,2000,%
B,1000,t
C,1400,¥
D,32,d
E,520,d
F,10000,d
G,5500,元
H,740,t
I,850,t
J,950,t
K,1100,t
L,1200,t

yesterday.csv

name,value,unit
A,1000,%
B,800,t
C,1200,¥
D,30,d
E,500,d
F,10000,d
G,5000,元
H,700,t
I,800,t
J,900,t
K,1000,t
L,1100,t

三、画图

大致流程

3.1 画布大小,位置

3.2 数据的映射关系,ordinal,linear 常用的。输入,输出

3.3 加载数据,画到指定位置

3.4 添加一些修饰。

var width = 960,height = 500;
var svg = d3.select("body").append("svg").attr("width",width).attr("height",height);
var margin = {top:50,left:60,right:60,bottom:50};
var xScale = d3.scale.linear().range([0,(width- margin.left - margin.right)/2]);    //X轴和Y轴
var yScale = d3.scale.ordinal().rangeRoundBands([0,height - margin.top - margin.bottom],0.1);   //
 
d3.csv("data/today.csv", function (data) {
        data.sort(function(a,b){ return d3.descending(parseInt(a.value),parseInt(b.value))}); //对加载的数据排序
        xScale.domain([0,d3.max(data, function (d) {
            return parseFloat(d.value);
        })]);
        yScale.domain(data.map(function(d){return d.name}));
        bar1 = svg.append("g")
                .attr("class","bar1")
                .attr("transform","translate("+ width/2 +"," + margin.top +")");
        bar1.selectAll("rect").data(data).enter()
                .append("rect")
                .attr("x", function (d) {
                    return 0;
                })
                .attr("y", function (d) {
                    return yScale(d.name);
                })
                .attr("width", function (d) {
                    return xScale(d.value);
                })
                .attr("height", function () {
                    return yScale.rangeBand();
                })
                .attr("fill","#00ff29");
        bar1.selectAll("text").data(data).enter()
                .append("text")
                .attr("x", function (d) {
                    return xScale(parseFloat(d.value));
                })
                .attr("y", function (d) {
                    return yScale(d.name)+yScale.rangeBand();
                })
                .text(function (d) {
                    return d.name + d.value + d.unit;
                })
    });
    d3.csv("data/yesterday.csv", function (data) {
        data.sort(function(a,b){ return d3.descending(parseInt(a.value),parseInt(b.value))});
//        xScale.domain([0,d3.max(data, function (d) {
//            return parseFloat(d.value);
//        })]);
//        yScale.domain(data.map(function(d){return d.name}));
        bar2 = svg.append("g")
                .attr("class","bar1")
                .attr("transform","translate("+ width/2 +"," + margin.top +")");
        bar2.selectAll("rect").data(data).enter()
                .append("rect")
                .attr("x", function (d) {
                    return 0-xScale(parseFloat(d.value));
                })
                .attr("y", function (d) {
                    return yScale(d.name);
                })
                .attr("width", function (d) {
                    return xScale(d.value);
                })
                .attr("height", function () {
                    return yScale.rangeBand();
                })
                .attr("fill","#f5ef13");
        bar2.selectAll("text").data(data).enter()
                .append("text")
                .attr("x", function (d) {
                    return (-40-xScale(parseFloat(d.value)));
                })
                .attr("y", function (d) {
                    return (parseFloat(yScale(d.name)) + parseFloat(yScale.rangeBand()));
                })
                .text(function (d) {
                    return d.name + d.value + d.unit;
                })
    });
    svg.append("text")
            .attr("class","title")
            .attr("x",300).attr("y",40).text("某公司.");
//添加一些修饰性内容
    d3.select("svg").append("rect")
            .attr("x",740)
            .attr("y",354)
            .attr("width","10")
            .attr("height",10)
            .attr("fill","#f5ef13");
    d3.select("svg").append("text")
            .attr("class","mark")
            .attr("x",755)
            .attr("y",364)
            .text("昨天");
    d3.select("svg").append("rect")
            .attr("x",740)
            .attr("y",369)
            .attr("width","10")
            .attr("height",10)
            .attr("fill","#00ff29")
    d3.select("svg").append("text")
            .attr("class","mark")
            .attr("x",755)
            .attr("y",379)
            .text("今天");

四、效果

五、总结

原理很简单,在指定位置画矩形,在指定位置写文字。

在这里标记下,以后稍加修改可以继续使用

时间: 2024-10-14 08:17:18

D3绘制水平柱状图的相关文章

使用D3绘制图表(5)--水平柱状图表

绘制水平柱状图表的方法也不是很难,首先在svg中插入g,然后在g中插入rect. 1.html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div id="container"></div> </body>

使用D3绘制图表(6)--竖直柱状图表

竖直柱状图的绘制是在水平柱状图的基础上修改的. 1.html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div id="container"></div> </body> <script type

使用D3绘制图表(7)--饼状图

这次是绘制饼状图,也是这一次使用D3绘制图表的最后一篇,大家可以从其他地方深入学习D3绘制图表,也可以直接查看D3的API进行学习,本次绘制饼状图的数据跟之前的卸载数组里面的不一样,这一次是使用d3的csv(url)函数读取的一个data.csv文件,在此声明,如果网页的编辑器不是使用自带的服务器打开网页的那就会读取不了csv文件报错,我这里使用的HBuilder,一款还不错的编辑器. 1.data.csv文件,以键值对的形式书写 education,population 大专及以上,11964

C# 绘制统计图(柱状图, 折线图, 扇形图)

统计图形种类繁多, 有柱状图, 折线图, 扇形图等等, 而统计图形的绘制方法也有很多, 有Flash制作的统计图形, 有水晶报表生成统计图形, 有专门制图软件制作, 也有编程语言自己制作的:这里我们用就C# 制作三款最经典的统计图: 柱状图, 折线图和扇形图:既然是统计, 当然需要数据, 这里演示的数据存于Sql Server2000中, 三款统计图形都是动态生成. 其中柱状图我会附上制作步骤, 其他两款统计图直接附源码. 说明: 需求不一样, 统计图形绘制后的显示效果也不一样, 比如这里柱状图

d3 绘制散点图

之前看了angularjs,又看了看d3 on angularjs这本书,本来打算使用angularjs,结果把npm玩坏了,现在都没修好,只好先单独用d3绘制了. 先贴代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>d3</title> 6 <script src=&q

C# 绘制统计图(柱状图, 折线图, 扇形图)【转载】

统计图形种类繁多, 有柱状图, 折线图, 扇形图等等, 而统计图形的绘制方法也有很多, 有Flash制作的统计图形, 有水晶报表生成统计图形, 有专门制图软件制作, 也有编程语言自己制作的:这里我们用就C# 制作三款最经典的统计图: 柱状图, 折线图和扇形图:既然是统计, 当然需要数据, 这里演示的数据存于Sql Server2000中, 三款统计图形都是动态生成. 其中柱状图我会附上制作步骤, 其他两款统计图直接附源码. 说明: 需求不一样, 统计图形绘制后的显示效果也不一样, 比如这里柱状图

D3画完整柱状图(带坐标轴、标签)

昨天晚上本来打算花一点时间把之前学的柱状图改一下,用CSV文件来替换自定义数据.这一替换可不得了,一晚上就搭进去了,还好今早找到了问题的所在,原因在于我的数据引用出了问题. 现在就来讲解一下如何画一个柱状图吧: 柱状图的画法和折线图其实很类似,只要掌握了比例尺的用法和坐标轴的画法,我们只要在此基础上添加“rect”元素添加矩形就可以了,但这其中也有一些要点,我会在其中标出,希望对你有用. 对于d3不同版本带来的代码不适用的解决办法:1).下载对应的v3或者v4版本加到代码引用里可以解决. 2).

使用D3绘制图表(3)--添加坐标轴和文本标签

上一篇是曲线的绘制,这样仅仅只是有一条线,完全先是不出数据想要表现的内容,于是我们要添加坐标系,添加坐标系和画线类似. 1.还是没有变化的html页面 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <link rel="stylesheet" href="css/style.css&q

iOS绘制收益柱状图

项目需求,参考了其他绘图demo,自己绘制出来了,不过代码改得有点乱,添加了很多变量,时间关系没用太合适的命名,逻辑处理也没进行优化. 看看效果图(虚线区域都是画的,其他区域添加的都是控件),附上源码 #import <UIKit/UIKit.h> typedef enum : NSUInteger { CSYieldTypeWeek = 0,    //周收益 CSYieldTypeMonth = 1,   //月收益 CSYieldTypeYear = 2,    //年收益 } CSYi