简体   繁体   English

在SVG之外的d3轴渲染

[英]d3 axis rendering outside the SVG

I'm adding two axis to an SVG, however, the y axis is rendered off the left of the SVG: 我正在向SVG添加两个轴,但是,y轴在SVG的左侧渲染:

Y轴偏离左边缘

If I set the orientation to 'right' then it's rendered, but on the left hand side: 如果我将方向设置为“右”,则将其渲染,但在左侧:

Y轴存在

The code is like this: 代码是这样的:

'use strict';

var margins = {top: 50, bottom: 50, left: 50, right: 50};
var dateFormat = d3.time.format('%d-%b-%y')
var svg = d3.select('.graph');

var svgWidth = parseInt(svg.style('width')),
    svgHeight = parseInt(svg.style('height'));

var height = svgHeight - margins.top - margins.bottom,
    width = svgWidth - margins.left - margins.right;

var dates = [], closes = [];

data.forEach(function(item) {
    dates.push(dateFormat.parse(item.date));
    closes.push(item.close);
});

var xScale = d3.time.scale().range([0, width]).domain([d3.min(dates), d3.max(dates)]);
var yScale = d3.scale.linear().range([height, 0]).domain([0, d3.max(closes)]);

var xAxis = d3.svg.axis().scale(xScale).orient('bottom');
var yAxis = d3.svg.axis().scale(yScale).orient('right');

svg.append("g")
    .attr("class", "x axis")
    .call(xAxis);

svg.append("g")
    .attr("class", "y axis")
    .call(yAxis);

The default position of any g is (0, 0) and .orient('left') means that the axis is placed to the left of (0, 0) , which is outside the scene. 任何g的默认位置是(0, 0).orient('left')意味着轴位于场景之外的(0, 0)左侧 You need to manually set the transform on the g element which contains the axis: 您需要在包含轴的g元素上手动设置transform

yAxis.orient('left');
svg.append('g')
  .attr('class', 'y axis')
  .attr('transform', 'translate(' + [margins.left, margins.top] + ')');
  .call(yAxis);

I'd look closer at some of the tried and true examples. 我会仔细研究一些经过尝试的 真实例子。

With the recommended form you are missing a "drawing area" g element. 使用推荐的表单,您缺少“绘图区域” g元素。

// have an SVG that is the drawing area width/height plus margins
// you don't show your mark-up but it looks like your code is ok 

// append a `g` element and translate it to your margins
// you'll do all your drawing to the g element
svg = svg.append("g")
  .attr("transform", "translate(" + margins.left + "," + margins.top + ")");

// append axis to this g
// your y-axis will be in the margin, so adjust margins.left to fit
svg.append("g")
  .attr("class", "y axis")
  .call(yAxis);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM