如何在d3中为轴添加文本标签?
例如,我有一个带x轴和y轴的简单折线图。
在我的x轴上,我有1到10的刻度。我想在它下面出现“days”这个词,所以人们知道x轴是在计算天数。
同样地,在y轴上,我将数字1-10作为刻度,我希望“吃三明治”这两个词出现在侧面。
有一种简单的方法吗?
答案 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()
功能创建图表轴时,您可以访问内置的两个名为tickValues
和tickFormat
的方法在函数内部,以便您可以指定需要哪些值的刻度以及希望文本显示的格式:
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轴标签像我一样:
-50
)chartHeight / 2
)代码示例:
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)");
答案 5 :(得分:0)
chart.xAxis.axisLabel('Label here');
或
xAxis: {
axisLabel: 'Label here'
},