Javascript 在d3.js中添加图像

Javascript 在d3.js中添加图像,javascript,d3.js,data-visualization,Javascript,D3.js,Data Visualization,我是java脚本和d3.js的新手。我想将图像添加到图表中的对应点。我看了很多问题和文章,但我没能正确地理解这一点。下面是我的代码 <!DOCTYPE html> <meta charset="utf-8"> <style> .bar { fill: steelblue; } .bar:hover { fill: brown; } .axis--x path { display: none; } .line { fill: none; st

我是java脚本和d3.js的新手。我想将图像添加到图表中的对应点。我看了很多问题和文章,但我没能正确地理解这一点。下面是我的代码

<!DOCTYPE html>
<meta charset="utf-8">
<style>
.bar {
  fill: steelblue;
}
.bar:hover {
  fill: brown;
}
.axis--x path {
  display: none;
}
.line {
  fill: none;
  stroke: steelblue;
  stroke-width: 3px;
}
.circle {
  fill: steelblue;
}
.axis--y path, .axis--y line {
  fill: none;
  stroke: none;
}
</style>
<svg width="960" height="500"></svg>
<script src="http://localhost/d3.js"></script>
<script>
var svg = d3.select("svg"),
    margin = {top: 50, right: 50, bottom: 30, left: 80},
    width = +svg.attr("width") - margin.left - margin.right,
    height = +svg.attr("height") - margin.top - margin.bottom;

var x= d3.scaleLinear().rangeRound([0, width]);

    y = d3.scaleBand().range([height, 0]).padding(0.1);
var g = svg.append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
d3.tsv("http://localhost/data1.tsv", function(d) {
  d.frequency = +d.frequency;
  return d;
}, function(error, data) {
  if (error) throw error;

  var line = d3.line()
    .x(function(d) { return x(d.frequency); })
    .y(function(d) { return y(d.letter)+30; })
    .curve(d3.curveStepAfter);

  x.domain([0, d3.max(data, function(d) { return d.frequency; })]);

  y.domain(data.map(function(d) { return d.letter; }));

  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))
    .append("text")
      .attr("transform", "rotate(-90)")
      .attr("y", 6)
      .attr("dy", "0.71em")
      .attr("text-anchor", "end")
      .text("letter");

  g.append("path")
    .datum(data)
    .attr("class", "line")
    .attr("d", line);

});
</script>

.酒吧{
填充:钢蓝;
}
.bar:悬停{
填充物:棕色;
}
.轴--x路径{
显示:无;
}
.线路{
填充:无;
笔画:钢蓝;
笔画宽度:3px;
}
.圆圈{
填充:钢蓝;
}
.axis--y路径,.axis--y线{
填充:无;
中风:无;
}
var svg=d3。选择(“svg”),
边距={顶部:50,右侧:50,底部:30,左侧:80},
宽度=+svg.attr(“宽度”)-margin.left-margin.right,
高度=+svg.attr(“高度”)-margin.top-margin.bottom;
var x=d3.scaleLinear().rangeRound([0,宽度]);
y=d3.scaleBand().range([height,0])。padding(0.1);
var g=svg.append(“g”)
.attr(“转换”、“平移”(+margin.left+)、“+margin.top+”);
d3.tsv(”http://localhost/data1.tsv“,功能(d){
d、 频率=+d.频率;
返回d;
},函数(错误,数据){
如果(错误)抛出错误;
var line=d3.line()
.x(函数(d){返回x(d.频率);})
.y(函数(d){返回y(d.letter)+30;})
.曲线(d3.曲线以下);
x、 域([0,d3.max(数据,函数(d){返回d.frequency;})];
y、 域(data.map(函数(d){返回d.letter;}));
g、 附加(“g”)
.attr(“类”、“轴--x”)
.attr(“变换”、“平移(0)”、“高度+”)
.call(d3.axisBottom(x));
g、 附加(“g”)
.attr(“类”、“轴--y”)
.呼叫(d3.左(y))
.append(“文本”)
.attr(“变换”、“旋转(-90)”)
.attr(“y”,6)
.attr(“dy”,“0.71em”)
.attr(“文本锚定”、“结束”)
.文本(“信函”);
g、 附加(“路径”)
.基准(数据)
.attr(“类”、“行”)
.attr(“d”,行);
});
此图像是上述代码的输出:

我想在下面的链接中添加图标或小图像

此图显示了我希望如何将图标添加到图表中:


一个类似于我的问题是,但这对我不起作用,我也想添加我的自定义图标。

如果您希望为工具提示添加这样的图像,请通过添加类似的内容以图像替换圆形

focus.append('svg:image')
.attr({
  'xlink:href': 'test.png', 
  x: 0,
  y: 0,
  width: 10,
  height: 10
});

如果希望将图像添加为数据点,请按照上面的代码将点替换为图像。

如果希望为这样的工具提示添加图像,请通过添加以下内容将圆替换为图像

focus.append('svg:image')
.attr({
  'xlink:href': 'test.png', 
  x: 0,
  y: 0,
  width: 10,
  height: 10
});

如果希望将图像添加为数据点,请查看上面的代码,将点替换为图像。

我遇到了类似的问题,但能够解决它

最初,我有一个这样的基本点风格

   svg
      .append("g")
      .selectAll("dot")
      .data(data)
      .enter()
      .append("circle")
        .attr("cx", function(d) { return x(d.date) } )
        .attr("cy", function(d) { return y(d.value) } )
        .attr("r", 5)
        .attr("fill", "#69b3a2")
并将其更改为以图像作为点

  svg
    .append('g')
    .selectAll('dot')
    .data(data)
    .enter()
    .append('svg:image')
    .attr('xlink:href', function (d) {
      return 'paht/to/image'
    })
    .attr('x', function (d) {
      return x(d.date);
    })
    .attr('y', function (d) {
      return y(d.value);
    });

如果您想查看整个上下文,我的图表基于此示例

我有一个类似的问题,但能够解决它

最初,我有一个这样的基本点风格

   svg
      .append("g")
      .selectAll("dot")
      .data(data)
      .enter()
      .append("circle")
        .attr("cx", function(d) { return x(d.date) } )
        .attr("cy", function(d) { return y(d.value) } )
        .attr("r", 5)
        .attr("fill", "#69b3a2")
并将其更改为以图像作为点

  svg
    .append('g')
    .selectAll('dot')
    .data(data)
    .enter()
    .append('svg:image')
    .attr('xlink:href', function (d) {
      return 'paht/to/image'
    })
    .attr('x', function (d) {
      return x(d.date);
    })
    .attr('y', function (d) {
      return y(d.value);
    });

如果您想查看整个上下文,我的图表基于此示例

您是否尝试过图像标记?类似问题的答案不应该成为问题。你能告诉我们你是如何使用这种方法尝试嵌入图标的吗?另外,您能添加一些数据吗?我正在尝试添加存储在系统中的图像,而不是上面代码中绘制的圆。您尝试过图像标记吗?类似问题的答案不应该成为问题。你能告诉我们你是如何使用这种方法尝试嵌入图标的吗?另外,您可以添加一些数据吗?我正在尝试添加存储在系统中的图像,而不是上面代码中绘制的圆。我添加了以下代码g.append('image')。data(data)。attr(“xlink:href”“,”)。attr(“x”,函数(d){return x(d.frequency);})。attr(“y”,函数(d){return y(d.letter)+30;})。attr(“然而,只有第一个图像中的第一个图像显示,其余的图像不显示。这是为什么?我添加了以下代码g.append('image').data(data).attr('xlink:href').attr('x',function(d){return x(d.frequency);}.attr('y',function(d){return y(d.letter)+30;}).attr(“宽度”,24)。attr(“高度”,24)。但是,仅显示第一个图像中的第一个图像,而不显示其余图像。为什么会这样?