如何在 d3 中绘图时仅从 csv 中绘制和符号化选定的列?
How plot and symbolize only selected columns from csv in plotting in d3?
如何在 Dominion 上也应用我在 Catan 上使用的相同符号格式?
而且还只保留 Catan、Dixit 和 Dominion,不显示其余的?我需要加载和读取所有数据,因为稍后我会需要它们,但对于此图表,我只需要显示三列。
我有一些我认为相关的代码片段:
//-----------------------------DATA-----------------------------//
const timeConv = d3.timeParse("%m-%d-%Y");
const dataset = d3.csv("ratings.csv");
dataset.then(function(data) {
var slices = data.columns.slice(1).map(function(id) {
return {
id: id,
values: data.map(function(d){
return {
date: timeConv(d.date),
measurement: +d[id]
};
})
};
});
//----------------------------LINES-----------------------------//
const line = d3.line()
.x(function(d) { return xScale(d.date); })
.y(function(d) { return yScale(d.measurement); });
let id = 0;
const ids = function () {
return "line-"+id++;
}
//----------------------------LINES-----------------------------//
const lines = svg.selectAll("lines")
.data(slices)
.enter()
.append("g");
lines.append("path")
.attr("class", ids)
.attr("d", function(d) { return line(d.values); });
lines.append("text")
.attr("class","serie_label")
.datum(function(d) {
return {
id: d.id,
value: d.values[d.values.length - 1]}; })
.attr("transform", function(d) {
return "translate(" + (xScale(d.value.date) + 10)
+ "," + (yScale(d.value.measurement) + 5 ) + ")"; })
.attr("x", 5)
.text(function(d) { return d.id; });
//----------------------------Symbols-----------------------------//
svg.selectAll("myDots")
.data(slices)
.enter()
.append('g')
.style("fill", "white")
// Second we need to enter in the 'values' part of this group
.selectAll("myPoints")
.data(function(d){ return slices[0].values.filter(function(d,i) { return i%3 == 2})})
.enter()
.append("circle")
.attr("class", ids)
.attr("cx", function(d) { return xScale(d.date) } )
.attr("cy", function(d) { return yScale(d.measurement);})
.attr("r", 15)
.attr("stroke", "black")
这是我现在的图表:
和数据样本:
date Catan Dominion Codenames Terraforming Magic Dixit
11/1/2016 213 46 20 69 138 141
12/1/2016 216 47 20 28 138 143
1/1/2017 219 50 20 24 141 146
2/1/2017 224 52 22 19 143 151
3/1/2017 226 54 22 17 144 155
4/1/2017 230 55 24 13 144 157
5/1/2017 234 55 28 9 145 158
6/1/2017 236 55 32 8 147 159
7/1/2017 239 55 32 8 145 160
8/1/2017 245 57 33 7 146 163
9/1/2017 250 57 34 7 149 166
10/1/2017 251 58 36 7 150 169
11/1/2017 255 60 36 6 151 170
12/1/2017 264 61 35 6 150 171
1/1/2018 270 61 36 6 152 173
2/1/2018 274 65 39 5 154 182
映射数据以过滤掉未包含在 keys
中的列:
d3.csv("ratings.csv").then(data => {
const keys = ['date', 'Dixit', 'Dominion'];
const filteredData = data.map(item =>
keys.reduce((obj, key) => ({...obj, [key]: item[key]}), {}));
...
});
如何在 Dominion 上也应用我在 Catan 上使用的相同符号格式? 而且还只保留 Catan、Dixit 和 Dominion,不显示其余的?我需要加载和读取所有数据,因为稍后我会需要它们,但对于此图表,我只需要显示三列。 我有一些我认为相关的代码片段:
//-----------------------------DATA-----------------------------//
const timeConv = d3.timeParse("%m-%d-%Y");
const dataset = d3.csv("ratings.csv");
dataset.then(function(data) {
var slices = data.columns.slice(1).map(function(id) {
return {
id: id,
values: data.map(function(d){
return {
date: timeConv(d.date),
measurement: +d[id]
};
})
};
});
//----------------------------LINES-----------------------------//
const line = d3.line()
.x(function(d) { return xScale(d.date); })
.y(function(d) { return yScale(d.measurement); });
let id = 0;
const ids = function () {
return "line-"+id++;
}
//----------------------------LINES-----------------------------//
const lines = svg.selectAll("lines")
.data(slices)
.enter()
.append("g");
lines.append("path")
.attr("class", ids)
.attr("d", function(d) { return line(d.values); });
lines.append("text")
.attr("class","serie_label")
.datum(function(d) {
return {
id: d.id,
value: d.values[d.values.length - 1]}; })
.attr("transform", function(d) {
return "translate(" + (xScale(d.value.date) + 10)
+ "," + (yScale(d.value.measurement) + 5 ) + ")"; })
.attr("x", 5)
.text(function(d) { return d.id; });
//----------------------------Symbols-----------------------------//
svg.selectAll("myDots")
.data(slices)
.enter()
.append('g')
.style("fill", "white")
// Second we need to enter in the 'values' part of this group
.selectAll("myPoints")
.data(function(d){ return slices[0].values.filter(function(d,i) { return i%3 == 2})})
.enter()
.append("circle")
.attr("class", ids)
.attr("cx", function(d) { return xScale(d.date) } )
.attr("cy", function(d) { return yScale(d.measurement);})
.attr("r", 15)
.attr("stroke", "black")
这是我现在的图表:
和数据样本:
date Catan Dominion Codenames Terraforming Magic Dixit
11/1/2016 213 46 20 69 138 141
12/1/2016 216 47 20 28 138 143
1/1/2017 219 50 20 24 141 146
2/1/2017 224 52 22 19 143 151
3/1/2017 226 54 22 17 144 155
4/1/2017 230 55 24 13 144 157
5/1/2017 234 55 28 9 145 158
6/1/2017 236 55 32 8 147 159
7/1/2017 239 55 32 8 145 160
8/1/2017 245 57 33 7 146 163
9/1/2017 250 57 34 7 149 166
10/1/2017 251 58 36 7 150 169
11/1/2017 255 60 36 6 151 170
12/1/2017 264 61 35 6 150 171
1/1/2018 270 61 36 6 152 173
2/1/2018 274 65 39 5 154 182
映射数据以过滤掉未包含在 keys
中的列:
d3.csv("ratings.csv").then(data => {
const keys = ['date', 'Dixit', 'Dominion'];
const filteredData = data.map(item =>
keys.reduce((obj, key) => ({...obj, [key]: item[key]}), {}));
...
});