Маркировка осей d3
Как добавить текстовые метки к осям в d3?
Например, у меня есть простой линейный граф с осью x и y.
На моей оси х у меня есть отметки от 1 до 10. Я хочу, чтобы под ними появилось слово "дни", чтобы люди знали, что ось х подсчитывает дни.
Аналогично, по оси y у меня есть цифры 1-10 как тики, и я хочу, чтобы слова "сэндвичи съели" появлялись сбоку.
Есть ли простой способ сделать это?
Ответы
Ответ 1
Маркеры Axis не встроены в D3 компонент оси, но вы можете добавлять метки самостоятельно, добавляя SVG text
элемент, Хорошим примером этого является мое воссоздание анимированной пузырьковой диаграммы Gapminders, Богатство и здоровье наций. Метка 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
).
Ответ 2
В новой версии 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");
Ответ 3
Если вы хотите, чтобы метка оси y была посередине оси y, как я сделал:
- Повернуть текст на 90 градусов с помощью текстового анкера
- Перевести текст по его середине
- положение x: предотвращение перекрытия меток ярлыков оси y (
-50
)
- y position: совместить середину оси y (
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.
Ответ 4
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
Ответ 5
Если вы работаете в d3.v4, как и было предложено, вы можете использовать этот экземпляр, предлагая все, что вам нужно.
Вы можете просто захотеть заменить данные оси X на ваши "дни", но не забудьте правильно проанализировать строковые значения и не применять concatenate.
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)");
скрипка с глобальным css/js
Ответ 6
chart.xAxis.axisLabel('Label here');
или
xAxis: {
axisLabel: 'Label here'
},