html - d3.js : Getting gradients on a bar chart?

标签 html svg d3.js

我用了Mike's code创建条形图,但似乎无法在其上添加渐变。页面呈现空白。 Firebug 没有显示错误,所以我基本上有两个问题:
1. 我做错了什么?
2. 当样式有错误而Firebug 没有显示错误时,如何调试并找出问题的原因?

代码:

<!DOCTYPE html>
<html>
<body>
<meta charset="utf-8">
<style>

.chart rect {
  fill: steelblue;
}

.chart text {
  fill: white;
  font: 10px sans-serif;
  text-anchor: end;
}

</style>
<svg class="chart"></svg>
<script src="d3/d3.v3.min.js"></script>
<script>
var svg = d3.select("body");

var gradient = svg.append("svg:defs")
    .append("svg:linearGradient")
    .attr("id", "gradient")
    .attr("x1", "0%")
    .attr("y1", "0%")
    .attr("x2", "100%")
    .attr("y2", "100%")
    ;//.attr("spreadMethod", "pad");

gradient.append("svg:stop")
    .attr("offset", "0%")
    .attr("stop-color", "#0c0")
    .attr("stop-opacity", 1);

gradient.append("svg:stop")
    .attr("offset", "100%")
    .attr("stop-color", "#c00")
    .attr("stop-opacity", 1);


var data = [4, 8, 15, 16, 23, 42];
var width = 420, barHeight = 20;

var svg = d3.select("body").append("svg:svg")
    .attr("width", width)
    .attr("height", barHeight);

    var gradient = svg.append("svg:defs")
    .append("svg:linearGradient")
    .attr("id", "gradient")
    .attr("x1", "0%")
    .attr("y1", "0%")
    .attr("x2", "100%")
    .attr("y2", "100%")
    .attr("spreadMethod", "pad");

    gradient.append("svg:stop")
    .attr("offset", "0%")
    .attr("stop-color", "#0c0")
    .attr("stop-opacity", 1);

    gradient.append("svg:stop")
    .attr("offset", "100%")
    .attr("stop-color", "#c00")
    .attr("stop-opacity", 1);

var x = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([0, width]);

var chart = d3.select(".chart")
    .attr("width", width)
    .attr("height", barHeight * data.length);

var bar = chart.selectAll("g")
    .data(data)
    .enter().append("g")
    .attr("transform", function(d, i) { return "translate(0," + i * barHeight + ")"; });

bar.append("rect")
    .attr("width", x)
    .attr("height", barHeight - 1)
    .style("fill", "url(#gradient)");


bar.append("text")
    .attr("x", function(d) { return x(d) - 3; })
    .attr("y", barHeight / 2)
    .attr("dy", ".35em")
    .text(function(d) { return d; });

</script>
</body>
</html>

最佳答案

您的示例中有两个具有相同 ID 的渐变。您还没有为 html 或 body 元素指定宽度,这意味着您将看不到任何内容。否则你的代码是正确的。

这对我在 Firefox 上有效...

<!DOCTYPE html>
<html>
<body>
<meta charset="utf-8">
<style>

.chart rect {
  fill: steelblue;
}

.chart text {
  fill: white;
  font: 10px sans-serif;
  text-anchor: end;
}

html, body {
  width: 100%;
  height: 100%;
}

</style>
<svg class="chart"></svg>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var svg = d3.select("body");


var data = [4, 8, 15, 16, 23, 42];
var width = 420, barHeight = 20;

var svg = d3.select("body").append("svg:svg")
    .attr("width", width)
    .attr("height", barHeight);

    var gradient = svg.append("svg:defs")
    .append("svg:linearGradient")
    .attr("id", "gradient")
    .attr("x1", "0%")
    .attr("y1", "0%")
    .attr("x2", "100%")
    .attr("y2", "100%")
    .attr("spreadMethod", "pad");

    gradient.append("svg:stop")
    .attr("offset", "0%")
    .attr("stop-color", "#0c0")
    .attr("stop-opacity", 1);

    gradient.append("svg:stop")
    .attr("offset", "100%")
    .attr("stop-color", "#c00")
    .attr("stop-opacity", 1);

var x = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([0, width]);

var chart = d3.select(".chart")
    .attr("width", width)
    .attr("height", barHeight * data.length);

var bar = chart.selectAll("g")
    .data(data)
    .enter().append("g")
    .attr("transform", function(d, i) { return "translate(0," + i * barHeight + ")"; });

bar.append("rect")
    .attr("width", x)
    .attr("height", barHeight - 1)
    .style("fill", "url(#gradient)");


bar.append("text")
    .attr("x", function(d) { return x(d) - 3; })
    .attr("y", barHeight / 2)
    .attr("dy", ".35em")
    .text(function(d) { return d; });

</script>
</body>
</html>

关于html - d3.js : Getting gradients on a bar chart?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22138897/

相关文章:

javascript - D3.js .rangeBands() 返回 'undefined' 仅包含最后一个值?

html - 如何从导航栏中的链接创建下拉菜单

javascript - HTML2canvas 生成模糊图像

html - 在 OPTGROUP 元素上应用 CSS 类

internet-explorer - Raphaeljs 在 IE 中将所有文本呈现为斜体

javascript - 将文本附加到框架

javascript - JS/d3.js - 删除/合并 d3.js 节点图中的重复链接

html - 如何从文本区域元素中删除调整大小的 Angular ?

svg - 如何更改由 gnuplot 生成的 svg 标签?

Javascript:在 svg 中使用字体图标。如何使用 "\u"?