Homework1
一、错误描述
可视语言与信息可视化实验中的heat map实验时,绘制的图像总有三条是黑色
二、产生原因
这三条数据的名称以数字开头
三、如何发现
在仔细查看源码,去网上查询有同样错误的人的求问后,明白这里有个error。
四、如何改正
在源数据和代码中相应位置加上P开头,避免数字开头。
五、源码
<!DOCTYPE html>
//省略……
<body>
<div id="chart"></div> <!-- div定义一个大块 -->
<div id="newdiv"></div> <!-- div定义一个大块 -->
<script type="text/javascript">
var array_data = [];
// 一句话定义了众多变量, 定义了块儿的位置、宽高、小格子的边长等等与布局有关的变量
var margin = { top: 50, right: 0, bottom: 100, left: 150 },
width = 960 - margin.left - margin.right, // 所有格子区域的宽度,即Heatmap的宽度
height = 1830 - margin.top - margin.bottom,
gridSize = Math.floor(width / 24), // 求地板,即去掉小数部分,width分成24份
legendElementWidth = gridSize * 2, // 底下长条的长度,是格子边长的两倍
buckets = 9, // 一共9种颜色级别
colors = ["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],
tests = ["G","MIN","PTS","FGM","FGA","FGP","FTM","FTA","FTP","3PM","3PA","3PP","ORB","DRB","TRB","AST","STL","BLK","TO","PF"];
// 函数,读取 CSV 文件
d3.csv("ball_data.csv",
function(error, data) {
/*if(error){
console.log(error);
}
console.log(csvdata);*/
// colorScale:颜色级别
var colorScale = d3.scale.quantile() // 按分位数取值,可使每个区域内元素个数相等
.domain([0, buckets - 1, d3.max(data, function (d) { return d.G; })]) // 定义域
// domain([0, n, 数据的最大值]);
.range(colors); // 值域:是颜色数组,函数的返回值是代表某种颜色的字符串
// 设置chart,svg
var svg = d3.select("#chart").append("svg") // 选择“chart”(就是div),加入一个svg,设置属性跟div一样大
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g") // 在svg内加入一个g(group组),并设置元素g的显示位置
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
// 编辑姓名行
var dayLabels = svg.selectAll(".nameLabel")
.data(data)
.enter() // 为data中每一项创建一个".dayLabel"
.append("text") // 为days中每一项创建一的".dayLabel"添加文本,下面全是设置文本的属性
.text(function (d, i) { return data[i].name; })
.attr("x", 0)
.attr("y", function (d, i) { return i * gridSize; })
.style("text-anchor", "end")
.attr("transform", "translate(-6," + gridSize / 1.5 + ")")
.attr("class", function (d, i)
{ return ((i >= 0 && i <= 4) ? "nameLabel mono axis axis-workweek" : "nameLabel mono axis"); }
);
// 编辑测试项行
var timeLabels = svg.selectAll(".testLabel")
.data(tests)
.enter().append("text")
.text(function(d) { return d; })
.attr("x", function(d, i) { return i * gridSize; })
.attr("y", 0)
.style("text-anchor", "middle")
.attr("transform", "translate(" + gridSize / 2 + ", -6)")
.attr("class", function(d, i) {
return ((i >= 7 && i <= 16) ? "testLabel mono axis axis-worktime" : "testLabel mono axis"); }
);
// 画出格子,暂不涂色,color[0]
for (var i = 0; i < 50; i++){
array_data[i*20] = data[i].G;
array_data[i*20+1] = data[i].MIN;
array_data[i*20+2] = data[i].PTS;
array_data[i*20+3] = data[i].FGM;
array_data[i*20+4] = data[i].FGA;
array_data[i*20+5] = data[i].FGP;
array_data[i*20+6] = data[i].FTM;
array_data[i*20+7] = data[i].FTA;
array_data[i*20+8] = data[i].FTP;
array_data[i*20+9] = data[i].P3PM;
array_data[i*20+10] = data[i].P3PA;
array_data[i*20+11] = data[i].P3PP;
array_data[i*20+12] = data[i].ORB;
array_data[i*20+13] = data[i].DRB;
array_data[i*20+14] = data[i].TRB;
array_data[i*20+15] = data[i].AST;
array_data[i*20+16] = data[i].STL;
array_data[i*20+17] = data[i].BLK;
array_data[i*20+18] = data[i].TO;
array_data[i*20+19] = data[i].PF;
}
var heatMap = svg.selectAll(".score")
.data(array_data)
.enter() // 为data中每一项创建一个".hour"
.append("rect")
.attr("x", function(d, i){ return (i % 20)*gridSize;})
.attr("y", function(d, i){ return parseInt(i / 20)*gridSize;})
.attr("rx", 6)
.attr("ry", 6)
.attr("class", "hour bordered")
.attr("width", gridSize)
.attr("height", gridSize)
.style("fill", "#FFFFFF");
// duration(1000) 在1000ns也就是1s内将格子图上色
heatMap.transition().duration(1000)
.style("fill", function(d) { return colorScale(d); });
// 鼠标停留显示value
heatMap.append("title").text(function(d) { return d.G; });
// legend 是一个有7个组的什么东西,,,
var legend = svg.selectAll(".legend")
.data([0].concat(colorScale.quantiles()), function(d) { return d; }) // 由data获得的元素个数为7
.enter().append("g")
.attr("class", "legend");
legend.append("rect")
.attr("x", function(d, i) { return legendElementWidth * i; })
.attr("y", height)
.attr("width", legendElementWidth)
.attr("height", gridSize / 2)
.style("fill", function(d, i) { return colors[i]; });
legend.append("text")
.attr("class", "mono")
.text(function(d) { return ">= "+Math.round(d); })
.attr("x", function(d, i) { return legendElementWidth * i; })
.attr("y", height + gridSize);
});
</script>
</body>
</html>