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

   昨天晚上本来打算花一点时间把之前学的柱状图改一下,用CSV文件来替换自定义数据。这一替换可不得了,一晚上就搭进去了,还好今早找到了问题的所在,原因在于我的数据引用出了问题。

现在就来讲解一下如何画一个柱状图吧:

  柱状图的画法和折线图其实很类似,只要掌握了比例尺的用法和坐标轴的画法,我们只要在此基础上添加“rect”元素添加矩形就可以了,但这其中也有一些要点,我会在其中标出,希望对你有用。

  对于d3不同版本带来的代码不适用的解决办法:1)、下载对应的v3或者v4版本加到代码引用里可以解决。

                       2)、对于我博客的代码,只要你确保网络畅通,应该不会出错

  

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>文档的标题</title> </head>
<body> <script src="https://cdn.bootcss.com/d3/3.5.15/d3.js"></script>//网页引用d3库

</body> </html>

好了,接下来就是完整代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>绘制图形</title>
    </head>
    <style>
        /* 给body添加大小 */
        body,
        html {
            height: 100%;
        }

            {
            padding: 0;
            margin: 0;
        }

        .axis path,
        .axis line {
            fill: none;
            stroke: black;
            shape-rendering: crispEdges;
        }

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

        .MyRect {
            fill: palevioletred;
        }

        .MyText {
            fill: black;
            text-anchor: middle;
            font-size: 10px;
        }
    </style>
    <body>
        <script src="https://cdn.bootcss.com/d3/3.5.15/d3.js"></script>
        <script>
            var width = 500;
            var height = 500;
            var svg = d3.select("body")
                .append("svg")
                .attr("width", width)
                .attr("height", height);
            var padding = {
                left: 30,
                right: 30,
                top: 20,
                bottom: 20
            };
            ////http://blog.sina.com.cn/s/blog_ad72a03a0102v1nx.html  含解释


            d3.csv("../bardata.csv", function(error, data, i) {
                if (error) {
                    console.log(error);
                }

                console.log(data);

                var datavalue = []
                for (let i = 0; i < data.length; i++) {
                    datavalue.push(data[i].value)
                }                   // var xp = d3.scale.ordinal()
                //         // .domain(d3.range(dataset.length))
                //         // 使用map来输入data数组中的字符
                //         .domain(data.map(function(d,i){
                //         //    console.log(d.items)
                //     return d.items
                // }))
                // .rangeRoundBands([0,width-padding.left-padding.right]);


                // var xp = d3.scale.ordinal()
                //     .domain(data.map(function(d){ return d.items;}))
                //     .rangeBands([0,width-padding.left-padding.right]);
//以上定义xp(即xscale)横坐标序数比例尺的方法都可以试一下,会有不同的体验
var xp = d3.scale.ordinal() .domain(data.map(function(d) { return d.items; })) .rangeRoundBands([0, width - padding.left - padding.right], 0.1); var yp = d3.scale.linear() .domain([0, d3.max(datavalue)]) .range([height - padding.top - padding.bottom, 0]) //反过来?为什么呢(之前似乎讲过哦0w0) var xAxis = d3.svg.axis() .scale(xp) .orient("bottom"); var yAxis = d3.svg.axis() .scale(yp) .orient("left"); var rectPadding = 4; var rects = svg.selectAll(".MyRect") .data(data) .enter() .append("rect") .attr("class", "MyRect") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") .attr("x", function(d, i) { return xp(d.items); }) .attr("y", function(d) { return yp(d.value); }) .attr("width", xp.rangeBand() - rectPadding) .attr("height", function(d) { return height - padding.top - padding.bottom - yp(d.value); }) .on("mouseover", function(d, i) { d3.select(this) .style("fill", "aliceblue"); }) .on("mouseout", function(d, i) { d3.select(this) .style("fill", "greenyellow"); // 使用style替换attr才会有交互的效果 });
var texts = svg.selectAll(".MyText") .data(data) //害我出错的就是这儿了,我之前写的是.data(datavalue),datavalue又是哪儿来的呢?为什么引用错误,会导致tips的位置错乱呢? .enter() .append("text") .attr("class", "MyText") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") .attr("x", function(d) { return xp(d.items);//上面问题的答案都在这儿,d=》data,数据的意思,那data是哪儿来的呢?当然是我们传进来的,那为什么data不会出错,而datavalue会错呢?
//是由于xp()是我们之前定义的序数比例尺,我们如果想要使用就必须传入适合的数据(包含x,y),如果只是传入datavalue就只有y值,而我们并没有将x传入。
}) .attr(
"y", function(d) { return yp(d.value); }) .attr("dx", function() { return (xp.rangeBand() - rectPadding) / 2; }) .attr("dy", function(d) { return 15; }) .text(function(d) { return d.value; }); svg.append("g") .attr("class", "axis") .attr("transform", "translate(" + padding.left + "," + (height - padding.bottom) + ")") .call(xAxis); svg.append("g") .attr("class", "axis") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") .call(yAxis); }) </script> </body> </html>

老样子,好货沉底

javascript和D3

———————————————————————————————————————————————————————————————————

修改:由于浏览器的沙箱机制导致直接复制代码是没法直接运行的,所以贴出原码外加数据

链接:https://pan.baidu.com/s/13RhuYM9pz0WiFya0IcOrJQ
提取码:069a

一、最简单的方法是下载HbuiderX,然后导入文件,打开。(二不用看了)

二、在此如果你没有安装任何服务器,直接想用文件启动网页的化,你可以这样做:

1)、确保你的电脑上安装了Python(二或者三的版本都可以)

2)、

在文件路径下打开cmd(上图最简,打开文件,输入cmd,回车ok)

3)、键入命令

Python2用这个

4)、启动服务器

5)、浏览器中输入:

打开文件,结束。

 

 

 

  

转载于:https://www.cnblogs.com/gti2baby/p/11286875.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用d3.js添加柱时,我们可以通过以下步骤来添加XY轴坐标: 1. 创建布:首先,我们需要创建一个SVG布,并设定合适的宽度和高度,以容纳我们的柱坐标轴。 2. 设定比例尺:根据数据的范围,我们需要设定一个比例尺来将数据映射到坐标轴上。比例尺可以是线性比例尺(d3.scaleLinear())或者是序数比例尺(d3.scaleOrdinal())。根据需要设定x轴和y轴的比例尺。 3. 创建坐标轴:使用d3.axis()函数创建一个坐标轴生成器,并通过指定比例尺和方向来定制坐标轴的样式和刻度。 4. 渲染坐标轴:将坐标轴生成器应用到x和y轴上,并通过translate()函数设置坐标轴的位置。例如,通过将x轴定位在底部,y轴定位在左边。 5. 创建柱:使用绑定数据的方式,通过SVG的矩形元素或g元素创建柱。可以根据数据的值来设定柱的宽度、高度和位置。 6. 添加动效果(可选):通过使用d3的过渡函数(transition)和延迟函数(delay),可以为柱添加动效果,使其显示变得平滑。 7. 标记坐标轴刻度(可选):可以使用d3的tickFormat函数来设定坐标轴上刻度的显示格式,如千位分隔符等。 通过以上步骤,我们就可以用d3.js添加柱并添加XY轴的坐标了。具体实现的代码可以参考d3.js的官方文档或相关教程。 ### 回答2: 在使用d3.js创建柱时,我们需要添加x和y轴坐标来帮助展示数据的分布和比较。下面是添加xy轴坐标的步骤: 1. 创建一个svg元素来容纳整个表。可以使用d3.select方法选择一个div元素,并通过append方法添加一个svg元素。 2. 设置svg元素的宽度和高度,以及padding值,以便给轴线留出足够的空间。 3. 创建一个x轴比例尺。根据柱的数据范围和svg的宽度,使用d3.scaleLinear方法创建一个线性比例尺。 4. 创建一个y轴比例尺。根据柱的数据范围和svg的高度,使用d3.scaleLinear方法创建一个线性比例尺。 5. 创建一个x轴生成器。使用d3.axisBottom方法创建一个x轴生成器,并传入之前创建的x比例尺。 6. 创建一个y轴生成器。使用d3.axisLeft方法创建一个y轴生成器,并传入之前创建的y比例尺。 7. 将x轴生成器应用到svg元素上的一个g元素上,并通过transform属性将其放置在适当的位置。 8. 将y轴生成器应用到svg元素上的一个g元素上,并通过transform属性将其放置在适当的位置。 9. 如果需要,可以对x轴和y轴进行一些样式设置,比如设置轴线颜色、刻度颜色、文本颜色等。 10. 最后,将柱绘制到svg元素上。可以使用d3.select方法选择之前创建的g元素,并通过data和enter方法添加rect元素来表示柱子。可以根据x和y比例尺的返回值来设置每个柱子的位置和高度。 以上就是使用d3.js添加xy轴坐标的基本步骤。根据实际需求和个性化要求,你可以对以上步骤进行进一步的扩展和样式设置。 ### 回答3: 要在d3js中添加柱并添加坐标轴,首先需要以下步骤: 1. 创建SVG元素:使用d3.select选择一个HTML元素,然后添加一个SVG元素,设置其宽度和高度。例如: var svg = d3.select("body") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 2. 创建坐标轴比例尺:使用d3.scaleBand()创建x轴比例尺,使用d3.scaleLinear()创建y轴比例尺。然后设置其域和范围。例如: var x = d3.scaleBand() .range([0, width]) .domain(data.map(function(d) { return d.x; })); var y = d3.scaleLinear() .range([height, 0]) .domain([0, d3.max(data, function(d) { return d.y; })]); 3. 添加柱:使用d3.selectAll选择所有柱子的元素,然后使用data()方法将数据绑定到这些元素上。然后使用enter()方法进入上次缺失的元素,并使用append()方法添加矩形元素作为柱子。例如: svg.selectAll(".bar") .data(data) .enter() .append("rect") .attr("class", "bar") .attr("x", function(d) { return x(d.x); }) .attr("y", function(d) { return y(d.y); }) .attr("width", x.bandwidth()) .attr("height", function(d) { return height - y(d.y); }); 4. 添加坐标轴:使用d3.axisBottom()创建x轴,使用d3.axisLeft()创建y轴。然后使用call()方法将坐标轴添加到SVG元素中。例如: svg.append("g") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); svg.append("g") .call(d3.axisLeft(y)); 以上就是在d3js中添加柱并添加坐标轴的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值