javascript - SVG 在浏览器上不显示任何内容

标签 javascript html css d3.js svg

您好,我刚开始学习 js,我遇到了一些问题。我的以下代码没有显示任何内容,我正在尝试从 csv 文件创建条形图,代码运行良好,bootstrap 库也正常工作,但是当我运行它时只有 svg 部分不可见,我在 eclipse IDE 上使用 tomcat 8.0 服务器非常感谢任何帮助。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Basic Bootstrap Template</title>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">

<script type = "text/javascript" src="d3/d3.v2.js"></script>
<script type = "text/javascript" src="d3/d3.v3.min.js"></script>
</head>
<body>
<div class="jumbotron text-center">
<h1>Clinical Data Analysis</h1>
<p>Global Performance</p> 
</div>
<svg class="chart" width="40" height="40"></svg>
<p>Global Performance</p> 
<script>


var svg = d3.select("svg"),
    margin = 200,
    width = svg.attr("width") - margin,
    height = svg.attr("height") - margin;


var xScale = d3.scaleBand().range ([0, width]).padding(0.4),
    yScale = d3.scaleLinear().range ([height, 0]);

var g = svg.append("g")
           .attr("transform", "translate(" + 100 + "," + 100 + ")");

d3.csv("XYZ.csv", function(error, data) {
    if (error) {
        throw error;
    }

    xScale.domain(data.map(function(d) { return d.year; }));
    yScale.domain([0, d3.max(data, function(d) { return d.value; })]);

    g.append("g")
     .attr("transform", "translate(0," + height + ")")
     .call(d3.axisBottom(xScale));

    g.append("g")
     .call(d3.axisLeft(yScale).tickFormat(function(d){
         return "$" + d;
     }).ticks(10))
     .append("text")
     .attr("y", 6)
     .attr("dy", "0.71em")
     .attr("text-anchor", "end")
     .text("value");
});
</script>

<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 
</svg> 
</body>
</html>

代码正在运行,但条形图未显示

最佳答案

有两个问题,一是您使用的 d3 版本不符合您的代码,二是您的尺寸需要修改。

第一个问题是您使用的是旧版本的 d3:

<script type = "text/javascript" src="d3/d3.v2.js"></script>
<script type = "text/javascript" src="d3/d3.v3.min.js"></script>

但是使用 d3v4 命名空间:

yScale = d3.scaleLinear().range ([height, 0]);

例如,D3v3 使用 d3.scale.linear()

由于d3v3中的比例尺都是d3.scale的属性,d3库中没有位于d3.scaleBandd3.scaleLinear的属性或函数,因此你会看到你得到的错误。 D3v4改变了这种设计模式。

那么,让我们使用 d3v4,它解决了第一个问题。


其次,您的尺寸需要修改。你有一个 40x40 的 svg:

<svg class="chart" width="40" height="40"></svg>

但是你有 200 的边距(或每边 100),在 svg 的可见部分内自然不会出现任何内容。您实际上在此处指定了负高度和宽度:

width = svg.attr("width") - margin,    // width = 40 - 200
height = svg.attr("height") - margin;  // height = 40 - 200

相反,我们可以将 svg 增加到 500,500(例如)并将边距设置为更合理的值,例如 40 像素,然后我们应该会按预期看到您的坐标轴:

var svg = d3.select("svg"),
    margin = 40,
    width = svg.attr("width") - margin*2,
    height = svg.attr("height") - margin*2;

var xScale = d3.scaleBand().range ([0, width]).padding(0.4),
    yScale = d3.scaleLinear().range ([height, 0]);

var g = svg.append("g")
           .attr("transform", "translate(" + margin + "," + margin + ")");


var data = [
	{year: 2000, value: 100},
	{year: 2001, value: 200},
	{year: 2002, value: 300},
	{year: 2003, value: 400},
	{year: 2004, value: 200},
	{year: 2005, value: 100},
];

    xScale.domain(data.map(function(d) { return d.year; }));
    yScale.domain([0, d3.max(data, function(d) { return d.value; })]);

    g.append("g")
     .attr("transform", "translate(0," + (height) + ")")
     .call(d3.axisBottom(xScale));

    g.append("g")
     .call(d3.axisLeft(yScale).tickFormat(function(d){
         return "$" + d;
     }).ticks(10))
     .append("text")
     .attr("y", 6)
     .attr("dy", "0.71em")
     .attr("text-anchor", "end")
     .text("value");
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>
<h1>Clinical Data Analysis</h1>
<p>Global Performance</p> 
</div>
<svg class="chart" width="500" height="500"></svg>
<p>Global Performance</p> 

这里是 a bl.ock演示它。

我添加了一些直接嵌入的虚拟数据。我也没有添加一行,因为你没有包含代码,所以它只是轴

关于javascript - SVG 在浏览器上不显示任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50055197/

相关文章:

html - 调整大小的 Flash 电影上的 CSS 位置文本正确

javascript - 缩放时使元素适合视口(viewport)宽度

JavaScript 加载外部内容 SEO

javascript - 旋转时触发不透明度,jquery

javascript - 在响应式导航栏中将下拉菜单显示为 block 的问题

c# - 如何正确地为<audio>提供数据?

css - 如何制作纯 CSS 下拉列表(网站导航)

javascript - jQuery UI 自动完成在右键单击时保持打开状态

javascript - noscript 标签是否仅在禁用 JavaScript 时生成?

javascript - 动态改变位置angular.js