【问题标题】:D3.js Visualization - how to add Y axis gridlinesD3.js 可视化 - 如何添加 Y 轴网格线
【发布时间】:2016-12-14 21:24:47
【问题描述】:

我正在尝试将 y 网格线添加到我创建的 d3.js 可视化中。我已经尝试过其他帖子中的方法,例如创建函数等。

我发现了一些很好的例子,例如 http://bl.ocks.org/hunzy/11110940https://bl.ocks.org/d3noob/c506ac45617cf9ed39337f99f8511218

我尝试了 ticksize,但没有成功(可能是因为我已经写出了标签?)。

我也试过这段代码,但得到了 d3.axisLeft 不存在的错误。

// gridlines in y axis function
  function make_y_gridlines() {   
  return d3.axisLeft(yscale)
    .ticks(25)
    }
// add the Y gridlines
   main.append('g')     
     .attr("class", "grid")
     .call(make_y_gridlines()
        .tickSize(-width)
        .tickFormat("")
    )

但我无法让它适用于我的图表(尽管它可能非常简单)。

这是代码:

<!DOCTYPE html>
    <html>
       <head>
          <title>The d3 test</title>
<style>
  .chart {
   }

.main text {
         font: 10px sans-serif;  
 }

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

.tick line{
    opacity: 0.2;
    }

</style>
    <script type="text/javascript" src="http://mbostock.github.com/d3/d3.v2.js"></script>
  </head>
  <body>
    <div class='content'>

    </div>
    <script>
      var data = [[5,1,2],[4,2,2],[5,2,2],[3,3,1],[4,3,1],[5,3,2],[1,4,1],[5,4,2],[5,5,2],[5,6,2],[5,7,2],
      [2,8,1],[4,8,1],[5,8,2],[1,9,1],[3,9,1],[5,9,1],[1,10,2],[2,10,1],[3,10,1],[5,10,2],[1,11,3],[2,11,1],[3,11,2],[4,11,1],[5,11,1],
      [1,12,3],[5,12,5],[1,13,3],[3,13,2],[5,13,2],[1,14,1],[5,14,2],[4,15,2],[5,15,2],[3,16,1],[4,16,1],[5,16,2],[2,17,1],[5,17,2],
      [5,18,2],[5,18,2],[1,19,1],[2,19,1],[3,19,2],[5,19,1],[5,20,2],[4,21,1],[5,21,1],[1,22,1],[5,22,2],[2,23,2],[4,23,1],[5,23,2],[1,24,3],[5,24,1],
                  ];

var margin = {top: 30, right: 100, bottom: 30, left: 150}
  , width = 960 - margin.left - margin.right
  , height = 900 - margin.top - margin.bottom;

var xscale = d3.scale.linear()
          .domain([0, d3.max(data, function(d) { return d[0]; })])
          .range([ 0, width ]);

var yscale = d3.scale.linear()
        .domain([0, d3.max(data, function(d) { return d[1]; })])
        .range([ height, 0 ]);

var rscale = d3.scale.linear()
 .domain([0, d3.max(data, function(d) { return d[2]; })])
 .range([ 0, 25 ]);

var color = d3.scale.category10();

var chart = d3.select('body')

.append('svg:svg')
   .attr('width', width + margin.right + margin.left)
   .attr('height', height + margin.top + margin.bottom)
   .attr('class', 'chart')

var main = chart.append('g')
   .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')
   .attr('width', width)
   .attr('height', height)
   .attr('class', 'main')   

// draw the x axis
var xAxis = d3.svg.axis()
    .scale(xscale)
    .orient('bottom')
    .ticks(6)
    .tickFormat(function (d, i) {
        return ['','everyday','once a week','several times a week','1-3 times a month','less than once a month'][d];
    });


main.append('g')
  .attr('transform', 'translate(0,' + height + ')')
  .attr('class', 'main axis date')
  .call(xAxis);

// draw the y axis
var yAxis = d3.svg.axis()
  .scale(yscale)
  .orient('left')
  .ticks(25)
  .tickPadding(10)
  .tickFormat(function (d, i) {
        return ['','A','B','C','D','E','F','G','H','I'
        ,'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X'
        ][d];
    });

main.append('g')
  .attr('transform', 'translate(0,0)')
  .attr('class', 'main axis date')
  .call(yAxis);

var g = main.append("svg:g"); 

g.selectAll("scatter-dots")
  .data(data)
  .enter().append("svg:circle")
      .attr("cx", function (d,i) { return xscale(d[0]); } )
      .attr("cy", function (d) { return yscale(d[1]); } )
      .attr("r", function (d) { return rscale(d[2]); } )
      .style("fill", function(d) { return color(d[2]); });
      // .attr("r", 8);


    </script>
  </body>
</html>

【问题讨论】:

    标签: javascript d3.js gridlines


    【解决方案1】:

    您的示例使用 d3 的更新版本(分别为 v3 和 v4)。您正在使用的版本 2 的文档在我所见的情况下现在有点稀疏,但您使用的版本可能不包含您想要的刻度大小功能。

    如果您将 d3.js 版本更新为版本 3 而不是版本 2,您可以将 y 轴刻度设置为横跨绘图区域:

      yAxis.innerTickSize(-width)
    

    使用您的代码,我只需使用 d3.js v3 就可以正常工作

    <script src="http://d3js.org/d3.v3.js"></script>
    

    如果没有一些小的更改,使用 d3 v4 将破坏您的代码,因为有一些命名空间更改:例如,d3.scale.linear 现在是 nw d3.scaleLinear

    【讨论】:

    • 哈哈,好吧,我还是个菜鸟,这就是我使用 v2 的原因;非常感谢,效果很好
    【解决方案2】:

    您正在使用(无论出于何种原因)D3 版本 2。虽然建议使用较新的版本,但可以创建一些网格线,获取 y 轴刻度的位置:

    d3.selectAll("g.yAxis g") 
        .append("line") 
        .attr("class", "gridline")
        .attr("x1", 0) 
        .attr("y1", 0)
        .attr("x2", width)
        .attr("y2", 0);
    

    这是一个包含您的代码和 D3 v2 的演示:

    var data = [[5,1,2],[4,2,2],[5,2,2],[3,3,1],[4,3,1],[5,3,2],[1,4,1],[5,4,2],[5,5,2],[5,6,2],[5,7,2],
          [2,8,1],[4,8,1],[5,8,2],[1,9,1],[3,9,1],[5,9,1],[1,10,2],[2,10,1],[3,10,1],[5,10,2],[1,11,3],[2,11,1],[3,11,2],[4,11,1],[5,11,1],
          [1,12,3],[5,12,5],[1,13,3],[3,13,2],[5,13,2],[1,14,1],[5,14,2],[4,15,2],[5,15,2],[3,16,1],[4,16,1],[5,16,2],[2,17,1],[5,17,2],
          [5,18,2],[5,18,2],[1,19,1],[2,19,1],[3,19,2],[5,19,1],[5,20,2],[4,21,1],[5,21,1],[1,22,1],[5,22,2],[2,23,2],[4,23,1],[5,23,2],[1,24,3],[5,24,1],
                      ];
    
    var margin = {top: 30, right: 100, bottom: 30, left: 150}
      , width = 960 - margin.left - margin.right
      , height = 900 - margin.top - margin.bottom;
    
    var xscale = d3.scale.linear()
              .domain([0, d3.max(data, function(d) { return d[0]; })])
              .range([ 0, width ]);
    
    var yscale = d3.scale.linear()
            .domain([0, d3.max(data, function(d) { return d[1]; })])
            .range([ height, 0 ]);
    
    var rscale = d3.scale.linear()
     .domain([0, d3.max(data, function(d) { return d[2]; })])
     .range([ 0, 25 ]);
    
    var color = d3.scale.category10();
    
    var chart = d3.select('body').append('svg:svg')
       .attr('width', width + margin.right + margin.left)
       .attr('height', height + margin.top + margin.bottom)
       .attr('class', 'chart')
    
    var main = chart.append('g')
       .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')
       .attr('width', width)
       .attr('height', height)
       .attr('class', 'main')   
    
    // draw the x axis
    var xAxis = d3.svg.axis()
        .scale(xscale)
        .orient('bottom')
        .ticks(6)
        .tickFormat(function (d, i) {
            return ['','everyday','once a week','several times a week','1-3 times a month','less than once a month'][d];
        });
    
    
    main.append('g')
      .attr('transform', 'translate(0,' + height + ')')
      .attr('class', 'main axis date')
      .call(xAxis);
    
    // draw the y axis
    var yAxis = d3.svg.axis()
      .scale(yscale)
      .orient('left')
      .ticks(25)
      .tickPadding(10)
      .tickFormat(function (d, i) {
            return ['','A','B','C','D','E','F','G','H','I'
            ,'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X'
            ][d];
        });
    
    main.append('g')
      .attr('transform', 'translate(0,0)')
      .attr('class', 'yAxis main axis date')
      .call(yAxis);
    	
    	d3.selectAll("g.yAxis g") 
            .append("line") 
                .attr("class", "gridline")
                .attr("x1", 0) 
                .attr("y1", 0)
                .attr("x2", width)
                .attr("y2", 0);
    
    var g = main.append("svg:g"); 
    
    g.selectAll("scatter-dots")
      .data(data)
      .enter().append("svg:circle")
          .attr("cx", function (d,i) { return xscale(d[0]); } )
          .attr("cy", function (d) { return yscale(d[1]); } )
          .attr("r", function (d) { return rscale(d[2]); } )
          .style("fill", function(d) { return color(d[2]); });
          // .attr("r", 8);
    .axis path,
    		.axis line {
    			fill: none;
    			stroke: black;
    			shape-rendering: crispEdges;
    		}
    		
    		.gridline {
    			opacity: 0.25;
    		}
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/2.10.0/d3.v2.js"&gt;&lt;/script&gt;

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 2018-08-03
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 2016-04-21
      • 2016-05-31
      • 2021-09-29
      相关资源
      最近更新 更多