d3轴标记

时间:2012-06-25 12:20:29

标签: javascript d3.js axis-labels

如何在d3中为轴添加文本标签?

例如,我有一个带x轴和y轴的简单折线图。

在我的x轴上,我有1到10的刻度。我想在它下面出现“days”这个词,所以人们知道x轴是在计算天数。

同样地,在y轴上,我将数字1-10作为刻度,我希望“吃三明治”这两个词出现在侧面。

有一种简单的方法吗?

6 个答案:

答案 0 :(得分:151)

轴标签不是内置于D3的axis component,但您只需添加SVG text元素即可自行添加标签。一个很好的例子就是我重新设计Gapminder的动画气泡图The Wealth & Health of Nations。 x轴标签如下所示:

svg.append("text")
    .attr("class", "x label")
    .attr("text-anchor", "end")
    .attr("x", width)
    .attr("y", height - 6)
    .text("income per capita, inflation-adjusted (dollars)");

y轴标签如下:

svg.append("text")
    .attr("class", "y label")
    .attr("text-anchor", "end")
    .attr("y", 6)
    .attr("dy", ".75em")
    .attr("transform", "rotate(-90)")
    .text("life expectancy (years)");

您还可以使用样式表根据需要设置这些标签的样式,可以在一起(.label)或单独设置(.x.label.y.label)。

答案 1 :(得分:30)

在新的D3js版本(版本3以后)中,当您通过d3.svg.axis()功能创建图表轴时,您可以访问内置的两个名为tickValuestickFormat的方法在函数内部,以便您可以指定需要哪些值的刻度以及希望文本显示的格式:

var formatAxis = d3.format("  0");
var axis = d3.svg.axis()
        .scale(xScale)
        .tickFormat(formatAxis)
        .ticks(3)
        .tickValues([100, 200, 300]) //specify an array here for values
        .orient("bottom");

答案 2 :(得分:11)

如果你想让y轴中间的y轴标签像我一样:

  1. 使用text-anchor middle
  2. 将文本旋转90度
  3. 翻译文本的中点
    • x position:防止y轴刻度标签(-50
    • 重叠
    • y position:匹配y轴的中点(chartHeight / 2
  4. 代码示例:

    var axisLabelX = -50;
    var axisLabelY = chartHeight / 2;
    
    chartArea
        .append('g')
        .attr('transform', 'translate(' + axisLabelX + ', ' + axisLabelY + ')')
        .append('text')
        .attr('text-anchor', 'middle')
        .attr('transform', 'rotate(-90)')
        .text('Y Axis Label')
        ;
    

    这可以防止旋转整个坐标系,如上面的lubar所述。

答案 3 :(得分:1)

D3提供了一组非常低级的组件,可用于组合图表。您将获得构建块,轴组件,数据连接,选择和SVG。将它们组合在一起形成图表是你的工作!

如果你想要一个传统的图表,即一对轴,轴标签,一个图表标题和一个绘图区域,为什么不看看d3fc?它是一个开源的更高级别的D3组件。它包括一个可能是您需要的笛卡尔图表组件:

var chart = fc.chartSvgCartesian(
    d3.scaleLinear(),
    d3.scaleLinear()
  )
  .xLabel('Value')
  .yLabel('Sine / Cosine')
  .chartLabel('Sine and Cosine')
  .yDomain(yExtent(data))
  .xDomain(xExtent(data))
  .plotArea(multi);

// render
d3.select('#sine')
  .datum(data)
  .call(chart);

您可以在此处查看更完整的示例:https://d3fc.io/examples/simple/index.html

答案 4 :(得分:1)

如果您按照建议使用d3.v4,则可以使用此实例提供您需要的所有内容。

您可能只想用"天"替换X轴数据。但请记住正确解析字符串值而不应用连接。

parseTime也可以用日期格式缩放几天?

d3.json("data.json", function(error, data) {
if (error) throw error;

data.forEach(function(d) {
  d.year = parseTime(d.year);
  d.value = +d.value;
});

x.domain(d3.extent(data, function(d) { return d.year; }));
y.domain([d3.min(data, function(d) { return d.value; }) / 1.005, d3.max(data, function(d) { return d.value; }) * 1.005]);

g.append("g")
    .attr("class", "axis axis--x")
    .attr("transform", "translate(0," + height + ")")
    .call(d3.axisBottom(x));


g.append("g")
    .attr("class", "axis axis--y")
    .call(d3.axisLeft(y).ticks(6).tickFormat(function(d) { return parseInt(d / 1000) + "k"; }))
  .append("text")
    .attr("class", "axis-title")
    .attr("transform", "rotate(-90)")
    .attr("y", 6)
    .attr("dy", ".71em")
    .style("text-anchor", "end")
    .attr("fill", "#5D6971")
    .text("Population)");

fiddle with global css / js

答案 5 :(得分:0)

chart.xAxis.axisLabel('Label here');

xAxis: {
   axisLabel: 'Label here'
},