D3 -如何正确标记x轴
D3 - how to label x Axis correctly
我的目标是用1960年到2080年的年份标记x轴,每隔10步。我有一个。csv文件,看起来像这样:
Land,1960,1970,1980,1990,2000,2010,2020,2030,2040,2050,2060,2070,2080
Belgien,9128824,9660154,9855110,9947782,10239085,10839905,11824225,12885338,13918014,14758714,15400272,16027593,16614305
到目前为止,我得到了这个结果(见图)
结果图片
我不知道如何正确标记x轴。下面是我到目前为止的代码:
d3.csv("/Data/temp_eu_popul.csv", function(e, eu_popul) {
console.log(eu_popul);
var years = [1960,1970,1980,1990,2000,2010,2020,2030,2040,2050,2060,2070,2080];
console.log(years);
var population = [];
for(var i = 1960; i<=2080; i+= 10){
population.push(parseFloat(eu_popul[0][i]));
}
console.log(population);
var svg = d3.select("body")
.append("svg")
.attr("width", 500)
.attr("height", 500);
var y = d3.scaleLinear()
.domain(d3.extent(population))
.range([250, -50]);
var x = d3.scaleLinear()
.domain([0,years.length])
.range([100, 450]);
var yAxis = d3.axisLeft(y);
svg.append('g')
.attr("transform", "translate(75,150)")
.attr('class', 'y axis')
.call(yAxis);
var xAxis = d3.axisBottom(x);
svg.append('g')
.attr("transform", "translate(0,450)")
.attr('class', 'x axis')
.call(xAxis);
var circles = svg.selectAll("cirle").data(population).enter().append("circle")
.attr("cx", function(d,i){ return x(i); })
.attr("cy", function(d,i){ return 350-y(d); })
.attr("r", 2);
});
我想要做的就是改变:
var x = d3.scaleLinear()
.domain(d3.extent(years))
.range([100, 450]);
var circles = svg.selectAll("cirle").data(population).enter().append("circle")
.attr("cx", years)
.attr("cy", function(d,i){ return 350-y(d); })
.attr("r", 2);
});
另一件事是,我创建了一个额外的数组。但我打赌有更好的办法来解决这个问题。因为年份已经在csv文件中了。我能在不创建额外数组的情况下使用它们吗?
在您的情况下,您的x轴比例可以被认为是一个序数比例,因此您需要使用
x = d3.scaleOrdinal().domain(years).range([min, max])
,其中min和Max是您自己的x范围值,它将您的确切年份映射到像素x值。
对于"cx"调用,您应该使用.attr('cx', function(d) {return x(d)})
或者更简洁地说,.attr('cx', x)
是d3的缩写
您的circles
变量中也有拼写错误,您选择了所有"圆圈"!
另外,我认为你的csv数据最好是垂直格式,而不是水平格式:
Land, Belgien
1960, 9128824
等。
,然后你可以访问属性d.Land
和d.Belgien
,无论你想要相应的数字影响你的标记,从一个匿名的function(d,i){}
定义,你可以构造你的年数组,例如,通过使用
var years = eu_popul.map(function(d) {return d.Land});
试试这个:
var x = d3.scaleLinear()
.domain(d3.extent(years)) // or .domain(d3.extent(eu_popul[1]))
.range([100, 450]);
var xAxis = d3.axisBottom(x);
svg.append('g')
.attr("transform", "translate(0,450)")
.attr('class', 'x axis')
.call(xAxis);
var circles = svg.selectAll("circle").data(population).enter().append("circle")
.attr("cx", function(d,i){ return x(years[i]); })
.attr("cy", function(d,i){ return 350-y(d); })
.attr("r", 2);
});
相关文章:
- 如何使用d3在基于网格的(热图)图表上正确显示轴
- D3-更新时元素数量正确,但值错误
- d3.js yaxis没有正确绘制所有记号
- d3.mouse 偏移量返回的值不正确
- D3 图表过渡要么获得正确的数字或宽度,但不能同时获得两者
- D3:“bubble.nodes”未将正确的图形数据应用于数据集
- d3堆叠条形图未正确更新
- 为D3.js动画编写绑定的正确方法是什么
- svg上的圆圈无法使用D3 javascript库进行正确的转换
- d3中的数据联接;我一定没有正确理解选择和/或数据键功能
- d3.js enter()未正确绑定到数据-正在重新创建现有数据
- 在 x 轴 d3 上正确格式化年份
- D3:“SVG4601:SVG 路径数据的格式不正确,无法完全解析
- 颜色未正确呈现饼图 d3
- D3.js条形图 - 在图例单击时显示/隐藏条形.如何正确过滤
- .splice 方法未删除 d3 中数组中的正确项
- 刷新函数未正确调用 d3
- D3.js / NVD3.js 不显示正确的值
- 正确填充 D3 创建的增强 svg 路径
- D3数据表的第一行排序不正确- D3/DC/Crossfilter