【发布时间】:2026-01-05 12:35:01
【问题描述】:
我遇到了一个问题,我正在尝试创建一个带有轴的简单折线图,但该线不断剪裁到 y 轴。
我正在使用它来设置轴和线条的绘图区域。
var HEIGHT = 400,
WIDTH = 800,
MARGINS = {top: 20, right: 20, bottom: 30, left: 50},
DRAWING_HEIGHT = HEIGHT - MARGINS.top - MARGINS.bottom,
DRAWING_WIDTH = WIDTH - MARGINS.right - MARGINS.left,
xRange = d3.scale.linear().range([0, DRAWING_WIDTH]).domain([1947, 2011]),
yRange = d3.scale.linear().range([DRAWING_HEIGHT, 0]).domain([0, HEIGHT]);
xAxis = d3.svg.axis()
.scale(xRange)
.tickSize(12)
.tickFormat(d3.format("d"))
.orient("bottom")
.tickSubdivide(true);
yAxis = d3.svg.axis()
.scale(yRange)
.tickSize(10)
.orient("left")
.tickSubdivide(true);
visPanel.append("svg:g")
.attr("class", "x axis")
.attr("transform", "translate(" + MARGINS.left + "," + (DRAWING_HEIGHT + MARGINS.top) + ")")
.call(xAxis);
visPanel.append("svg:g")
.attr("class", "y axis")
.attr("transform", "translate(" + (MARGINS.left) + ","+ MARGINS.top+ ")")
.call(yAxis);
graphableArea = visPanel.append("svg:g")
.attr("transform", "translate(" + MARGINS.left + "," + (MARGINS.top) + ")");
我的线路功能是:
var line = d3.svg.line().interpolate("basis")
.x(function(d) { return xRange(d.year) + MARGINS.right + 0.5; })
.y(function(d) { return yRange(d.amount) + 0.5; })
.interpolate("linear");
如果我从“.x(function...”行中删除 MARGINS.right,那么该行将在 y 轴上结束。
请解释一下 d3 是如何绘制轴的?也就是说,我把它翻译成一个点后,它是把轴画到右边还是左边?
【问题讨论】:
-
查看页边距约定 - bl.ocks.org/mbostock/3019563。然后技巧是将宽度定义为 totalWidth - margin.left - margin.right
-
考虑使用“translate(” + MARGINS.left - xAxisOffset, yOffset),xAxisOffset 设置为 20px 而不是 xRange(d.year) + MARGINS.right + 0.5。最好不要向数据点添加任意值。
-
.orient("left") 表示刻度线和标签应绘制在轴线的左侧。
-
谢谢!我再次查看了我的数据,发现 x 轴是从 1946 年而不是 1947 年开始的,所以那一年的 x 值为负...
标签: javascript graph d3.js