javascript - D3.js v4,看不到文字

标签 javascript d3.js svg

我正在按照示例 here非常接近,不幸的是我不确定为什么在我的版本中没有显示文本。

我正在线性尺度上进行时间转换,它适用于矩形但不适用于文本。

这是 jsfiddle 链接:

https://jsfiddle.net/e1upd3kn/

JS代码:

/*jshint esversion: 6 */

const eventHeight = 10;
const padding = 20;
let eventYPos = 500;
let textYPos = 500;
var parseTime = d3.timeParse("%d-%b-%y");

let svgContainer = d3.select("body")
    .append("svg")
    .attr("width", 1000)
    .attr("height", 500)
    .style("border", "1px dotted silver");

var mindate = new Date(1987, 3, 30),
    maxdate = new Date(2016, 9, 16);

let events = [
    {
        "start":  "1-May-95",
        "end": "1-May-14",
        "eventName": "TEST1234",
        "color": "red"
    },
    {
        "start": "1-May-01",
        "end": "1-May-04",
        "eventName": "4444",
        "color": "blue"
    },
];

var xScale = d3.scaleTime().domain([mindate, maxdate]).range([0, 1000]);
var axis = d3.axisTop().scale(xScale);
var xAxisGroup = svgContainer.append("g")
    .attr("transform", "translate(0," + (50 - padding) + ")")
    .call(axis);

events.forEach(function (d) {
    d.start = parseTime(d.start);
    d.end = parseTime(d.end);  
});

let rects = svgContainer
    .selectAll("rect")
    .data(events)
    .enter()
    .append("rect");
let rectsAttributes = rects
    .attr("x", function (d) { return xScale(d.start);})
    .attr("y", function (d) { eventYPos -= 10; return eventYPos; })
    .attr("width", function (d) { return xScale(d.end) - xScale(d.start); })
    .attr("height", function (d) { return eventHeight; })
    .style("fill", function (d) { return d.color; });


let texts = svgContainer
    .selectAll("text")
    .data(events)
    .enter()
    .append("text");
let textLabels = texts
    .attr("x", function (d) { return xScale(d.start);})
    .attr("y", function (d) { textYPos -= 10; return textYPos; })
    .text(function (d) { return d.eventName; })
    .attr("font-family", "sans-serif")
    .attr("font-size", "20px")
    .attr("fill", "black");

最佳答案

当你这样做时:

let texts = svgContainer
    .selectAll("text")
    .data(events)
    .enter()
    .append("text");

您将数据绑定(bind)到非空选择,因为当这段代码运行时,SVG 中已经有一些 text 元素(从您的 x 轴)。

在“输入”选择中,确保您的选择不匹配任何现有元素很重要。

话虽如此,它应该是这样的:

let texts = svgContainer
    .selectAll(".text")//or anything that doesn't exist
    .data(events)
    .enter()
    .append("text");

这是您的 fiddle :https://jsfiddle.net/ek26rwnq/

关于javascript - D3.js v4,看不到文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40013718/

相关文章:

javascript - 为什么这些 Jest 测试失败了?类型错误 : Cannot read property 'apply' of undefined

javascript - 在 Angular 中,如何等待完成异步调用然后转到 foreach 内的下一个对象?

javascript - 使用 d3.js 工具在 javascript 中格式化日期

javascript - FabricJS:大网格对象模糊

html - 如何让 SVG 中的 Wings 移动?

html - 在 HTML 中使用 SVG 绘制新月

javascript - jQuery 多重选择器,带有 $(this) 用于下拉菜单和文本字段

php - 雅虎联系人 API

javascript - 一个 svg 中图表的多个容器的 D3 缩放行为

javascript - 将 JSON 从 Rails Controller 加载到 javascript 文件中的 d3 .defer() 函数