d3.js——柱状图

    我在作bar图的时候感受他就是先建立一个svg的容器,而后建立比例尺、坐标轴,柱形,文字,这些元素,而后转换一个角度,变换一下位置,把不少元素组合成一个g元素中加入svg标签中。剩下的就是一些方法的使用,这个得看官网的api,其实对于d3.scale.ordinal()、rangeRoundBands([0, width], 0.1)这些方法也不是特别懂,还得再学习。javascript

一、效果css

二、html页面html

 <div id="barChart"></div>

 

三、cssjava

<style type="text/css">
    /*柱状图样式*/
    .chart rect {
        stroke: white;
        fill: steelblue;
    }

    .chart rect:hover {
        fill: brown;
    }

    /*控制坐标轴样式*/
    .axis path,
    .axis line {
        fill: none;
        stroke: black;
        shape-rendering: crispEdges;
    }

    .axis text {
        font-family: sans-serif;
        font-size: 11px;
    }

    .axis g text {
        font-family: sans-serif;
        font-size: 11px;
        color: black;
    }
</style>

 

四、jsjson

<script src="~/Scripts/d3.v3.min.js"></script>

 

// 查询数据,数据就是后台返回的json数据
grid.load(obj, function (result) {
    if (result.total > 0) {
        //grid.setData(mini.decode(result.data));
        //grid.setTotalCount(result.total);
        BarChart(result.data);
    } else {
        mini.alert("没有查询到相关数据,请从新筛选!");
    }
}, function (e) {
    mini.alert("出现错误,请从新查询!");
});

 

 

 

//柱状图表js,我下面的东西都是一块一块的,用上哪段就能获得想要的效果
<script type="text/javascript">
    function BarChart(data) {
        //?d3.scale.ordinal()和他们的domain,,,translate,dy属性

        // 一、清空图表区内的图表,从新生成
        $('#barChart').html("");

        // 二、定义初始化数据,图表的上下左右距离和宽高,连续定义
        var margin = { top: 60, right: 30, bottom: 70, left: 50 },
            width = 1000 - margin.left - margin.right,
            height = 400 - margin.top - margin.bottom;

        // 三、建立容器并移动位置到合适(注意:这点由于append了一个g因此返回的svg实际上是这个g,后面的元素都在这里,定位也是相对于他)
        var svg = d3.select("div#barChart").append("svg")
            .attr("class", "chart")
            .attr("width", width + margin.left + margin.right)
            .attr("height", height + margin.top + margin.bottom)
            .append("g")
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

        // 四、定义计算X轴的线性比例尺的方法
        //散列值 把width平均分配到data的每一个数据段(好比是6个) 0~80,80~160,...值为(0,80,160,...)域宽80
        var xScale = d3.scale.ordinal()
            .domain(data.map(function(d) { return d.EquipName; }))
            //.rangeRoundBands([0,width], .1,1);//两种效果不同
            .rangeRoundBands([0, width], 0.1);

        // 五、定义计算Y轴的比例尺的方法
        var yScale = d3.scale.linear()
            .domain([0, d3.max(data, function(d) { return d.Downtime; })])
            .range([height, 0]);

        // 六、建立X坐标轴函数
        var xAxis = d3.svg.axis()
            .scale(xScale)
            .orient("bottom");

        // 七、建立Y轴坐标轴函数
        var yAxis = d3.svg.axis()
            .scale(yScale)
            .orient("left");

        // 八、建立柱状图(注意:貌似定位都是相对于左上角)
        svg.selectAll(".barRect").data(data).enter().append("rect")
            .attr("class", "barRect")
            .attr("x", function(d) { return xScale(d.EquipName); })//至关于function(d){return xScale(d);}
            .attr("y", function(d) { return yScale(d.Downtime); })//svg的坐标以左上角为原点,经过高度运算转成原点在左下角的效果
            .attr("width", xScale.rangeBand()) //获取散列值每段的长度 为矩形的宽
            .attr("height", function(d) { return height - yScale(d.Downtime); }); // 经过函数yScale  function(d){return  (420/42)*d}  获得矩形的高

        // 九、加背景横线
        svg.selectAll("line")
            .data(yScale.ticks(10))   //y.ticks 根据权重 把数据进行划分层次,增长可读性。能够本身改变ticks的值察看效果来理解
            .enter().append("line")   //画线 (x1,y1) ------> (x2,y2)
            .attr("x1", 0)
            .attr("x2", width)
            .attr("y1", function(d) { return height - yScale(d); })
            .attr("y2", function(d) { return height - yScale(d); })
            .style("stroke", "#ccc");

        // 十、加图表标题
        svg.append("text")
            .attr("x", (width / 2))
            .attr("y", -40)
            .attr("text-anchor", "middle")
            .style("font-size", "16px")
            .style("text-decoration", "underline")
            .text("最差十台设备停机时间表");

        // 十一、添加矩形上方的数字
        svg.selectAll(".label")
            .data(data)
            .enter().append("text")
            .attr("class", "label")
            .attr("x", function(d) { return xScale(d.EquipName) + xScale.rangeBand() / 2; })  //散列值+散列宽度的一半
            .attr("y", function(d) { return yScale(d.Downtime); })
            .attr("dx", ".35em") //  horizontal-align: middle 居中对齐
            .attr("dy", 0) // vertical-align: middle //垂直方向无偏移
            .attr("text-anchor", "end") // text-align: right
            .text(function(d) { return d.Downtime; });
            //.text(String); //设置数据为显示值 至关于.text(function(d){ return d;}


        // 最后加坐标轴不然影响不少东西
        // 9九、添加X坐标轴及坐标轴名称
        svg.append("g")
            .attr("class", "axis")
            .attr("transform", "translate(0," + height + ")")
            .call(xAxis)
            .append("text")
            .attr("transform", "translate(" + (width) + "," + 20 + ")")
            .style("text-anchor", "middle")
            .text("设备名称");

        // 若是x轴名称太长将其倾斜
        svg.selectAll(".axis g text")
            .style("text-anchor", "end")
            .attr("dx", "-.8em")
            .attr("dy", ".15em")
            .attr("transform", "rotate(-35)");

        // 100、添加Y坐标轴及坐标轴名称
        svg.append("g")
            .attr("class", "axis")
            .call(yAxis)
            .append("text")
            .attr("transform", "rotate(0)")
            .attr("x", 50)
            .attr("y", -20)
            .attr("dy", ".71em")
            .style("text-anchor", "end")
            .text("停机时间(h)");
    }
</script>
相关文章
相关标签/搜索