javascript - d3 中的多线图,包含几年的每月天气数据,基于时间的 x 轴问题
问题描述
我的数据格式如下:
DATE,TAVG
1939-09,80.0
1939-10,60.0
依此类推,直到 2018-12。我已经使用了 d3 的 .nest() 函数来将它分开几年。这样做可以让我为每年绘制一条线。
但是,我被秤绊倒了。代码示例x.domain(d3.extent(data, function(d) {return (d.date.getMonth());}));
似乎返回了一个数组 ["Dec", "Dec"],将我所有的 x 轴刻度都保留为 "Dec"。
那么,我在这里到底做错了什么?如何让我的 x 轴刻度为“Jan”、“Feb”等?
正在生成的错误的图像:
我的代码和我正在使用的天气数据可以在这个 github repo上找到。
我将在此处重现 javascript 代码本身:
// Define margins
var margins = {
top: 30, right: 20, bottom: 30, left: 50
}, width = 600 - margins.left - margins.right,
height = 270 - margins.top - margins.bottom;
var parseTime = d3.timeParse("%Y-%m");
// Scales for axes
var x = d3.scaleTime()
.range([0, width])//.tickFormat(d3.timeFormat("%B"))
var y = d3.scaleLinear().range([height, 0]);
// Line function
var weather_line = d3.line()
.x(function(d) { return x(d.date.getMonth());})
.y(function(d) { return y(d.tavg);});
var color = d3.scaleLinear()
.domain([1939, 2018]).range(["orange", "red"]);
// Svg object
var svg = d3.select("body").append("svg")
.attr("width", width + margins.left + margins.right)
.attr("height", height + margins.top + margins.bottom)
.append("g")
.attr("transform", "translate(" + margins.left + "," + margins.top + ")");
// Get data
// debuging variable
var debug;
var debug2;
var parseMonth = d3.timeFormat("%b");
d3.csv("weather_data.csv",
function(d) {
return {
date : parseTime(d.DATE),
tavg : +d.TAVG
};
}).then(function(data){
x.domain(d3.extent(data, function(d) {return (d.date.getMonth());}));
y.domain([0, d3.max(data, function(d) { return d.tavg; })]);
var years = d3.nest()
.key(function(d) { return d.date.getFullYear(); })
.entries(data);
years.forEach(function(d, i) {
svg.append("path")
.attr("class", "line")
.attr("d", weather_line(d.values))
.style("stroke", function() {return color(parseInt(d.key));});
});
// Add our axes
svg.append("g")
.attr("transform", "translate(0,"+height+")")
.call(d3.axisBottom(x).ticks(12).tickFormat(d3.timeFormat("%b")));
svg.append("g")
.call(d3.axisLeft(y).ticks(4));
});
解决方案
推荐阅读
- python - python程序创建了一个谷歌幻灯片演示,但结果是空的
- c# - 通过帖子将值传递给部分视图
- nuxt.js - 在 Nuxt 中使用自定义 webpack 加载器
- c - 预期的 struct foo* 但参数是函数指针的 struct foo* 类型
- python - Django 从 postgres JSON 字段中获取值
- spring - Spring Boot 千分尺 - 在端点中公开指标
- excel - 它说它“无法获取 WorksheetFunction 类的 vlookup 属性”
- node.js - AWS COGNITO:如何实施仅在 SignupConfirmation 之后而不是在 ForgotPassword/ResetPassword 确认之后才起作用的 Post Confirmation 触发器
- flutter - 在颤动中随机使用 Math.round
- javascript - 不显示来自 firebase 的数据