Javascript d3.js x-coord显示不正确
使用d3.js,图形的x坐标显示在x=0或y轴上。x轴表示日期和时间,y轴表示温度。但这只适用于ipad或iphone。在我自己的机器Linux上,它可以正确显示 图表和所有文件可在, ipad/iphone显示屏 虽然正确的图形是 这里是javascriptJavascript d3.js x-coord显示不正确,javascript,d3.js,Javascript,D3.js,使用d3.js,图形的x坐标显示在x=0或y轴上。x轴表示日期和时间,y轴表示温度。但这只适用于ipad或iphone。在我自己的机器Linux上,它可以正确显示 图表和所有文件可在, ipad/iphone显示屏 虽然正确的图形是 这里是javascript var xScale = d3.scaleTime() .domain([new Date(datahourly[0].date), d3.max(datahourly, function(d) {return new
var xScale = d3.scaleTime()
.domain([new Date(datahourly[0].date), d3.max(datahourly, function(d) {return new Date(d.date)})])
.range([0, (w-2*padding)]); // max x screen space is width - twice padding
var yScale = d3.scaleLinear()
.domain([0, d3.max(datahourly, function(d) {return d.temp})])
.range([(h-2*padding), 0]); // max y screen space is height - twice padding
var xAxis = d3.svg.axis(xScale) // d3 v.4
.ticks(9) // specify the number of ticks
/*.ticks(d3.time.days, 1) */
.tickFormat(d3.time.format('%H:00'))
.scale(xScale)
.orient("bottom");
var yAxis = d3.svg.axis(yScale)
.ticks(7)
.scale(yScale)
.orient("left");
var svg = d3.select('#hourly-readings')
.append('svg') // create an <svg> element
.attr('id', 'svgDaily')
.attr('width', w) // set its dimensions
.attr('height', h);
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + (2*padding - 15) + "," + (padding - 15) + ")")
.call(yAxis);
svg.append('g') // create a <g> element
.attr('class', 'axis') // specify classes
.attr("transform", "translate(" + (2*padding - 15) + "," + (h - padding - 15) + ")")
.call(xAxis); // let the axis do its thing
var lineFunctionStart = d3.svg.line()
.x(function(d) {return xScale(new Date(d.date)); })
.y(h - 2*padding - 5)
.interpolate("cardinal");
var lineFunction = d3.svg.line()
.x(function(d) {return xScale(new Date(d.date)); })
.y(function(d) {return yScale(d.temp); })
.interpolate("cardinal");
svg.append("path")
.attr('d', lineFunctionStart(datahourly))
.attr('stroke', "grey")
.attr('stroke-width', 1)
.style('fill', "white")
.attr("transform","translate(" + (2*padding - 13) + "," + (padding - 10) + ")")
.transition()
.duration(3000)
.attr('d', lineFunction(datahourly));
//var svg = d3.select('svg');
var svg = d3.select('#svgDaily');
svg.append("text") // text label for the x axis
.attr("x", 310)
.attr("y", h)
.style("font-size", "12")
.style("text-anchor", "middle")
.text("Time (1 hr. intervals)");
svg.append("text") // text label for the x axis
.attr('transform', 'rotate(-90)')
.attr("x", -85) // Because rotate is first x and y coordinates are transaposed
.attr("y", padding-17)
.style("font-size","10")
.style("text-anchor", "middle")
.text("Temp. Celcius");
var rects = svg.selectAll('circle')
.data(datahourly);
var newRects = rects.enter();
newRects.append('circle')
.attr('cx', function(d, i) { return (Math.random() * (w - 2*padding)) })
//.attr('cx', function(d, i) {
//return (5 + xScale(new Date(d.date)));
//})
.attr('cy', (h - (2*padding)))
.attr('r', 5)
.style('fill', "lightblue")
.attr("transform","translate(" + (2*padding - 18) + "," + (padding - 20) + ")")
.transition()
.duration(3000)
.delay(function(d, i) {return i * 300})
.attr('cx', function(d, i) {
return (5 + xScale(new Date(d.date)));
})
.attr('cy', function(d, i) {
return 10 + yScale(d.temp);
});
我在Linux上使用Chrome,在ipad和iphone上使用Safari。但我确实在iphone上安装了chrome,但图表仍然不正确
iOS是否存在svg问题
编辑:
主要问题是时间数据分析不正确
这是正确的解决方案
var data = [];
$.getJSON("data/data.json",
function(info){
data = info[0].fiveMinReadings;
//console.log(data);
var parseTime = d3.timeParse("%Y-%m-%d %H:%M:%S.%L");
data.forEach(function(d) {
d.date = d.date.slice(0,-3);// remove microseconds
d.date = parseTime(d.date);
d.temp = +d.temp;
});
// Beginning of graph for 5 minute readings
var padding = 25;
var w = 600;
var h = 300;
var xScale = d3.scaleTime()
.domain(d3.extent(data, function(d) { return d.date; }))
.range([0, (w-2*padding)]); // max x screen space is width - twice padding
var yScale = d3.scaleLinear()
.domain([0,d3.max(data, function(d) {return d.temp})])
.range([(h-2*padding), 0]); // max y screen space is height - twice padding
var xAxis = d3.axisBottom(xScale) // d3 v.4
.tickFormat(d3.timeFormat('%H:%M '))
.scale(xScale);
var yAxis = d3.axisLeft(yScale)
.scale(yScale);
var svg = d3.select('#five-min-readings')
.append('svg') // create an <svg> element
.attr('id','svgHourly')
.attr("align","center")
.attr('width', w) // set its dimensions
.attr('height', h);
var valueline = d3.line()
.curve(d3.curveCardinal)
.x(function(d) { return xScale(d.date); })
.y(h - 2*padding - 4);
var valueline2 = d3.line()
.curve(d3.curveCardinal)
.x(function(d) { return xScale(d.date); })
.y(function(d) {return yScale(d.temp); });
svg.append("text") // text label for the x axis
.attr("x", 310)
.attr("y", h)
.style("font-size", "12")
.style("text-anchor", "middle")
.text("Time (5 min. intervals)");
svg.append("text") // text label for the x axis
.attr('transform', 'rotate(-90)')
.attr("x", -85) // Because rotate is first, x and y coordinates are transaposed
.attr("y", padding-17)
.style("font-size","10")
.style("text-anchor", "middle")
.text("Temp. Celcius");
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + (2*padding-15) + "," + (padding-15) + ")")
.call(yAxis);
svg.append('g') // create a <g> element
.attr('class', 'axis') // specify class
.attr("transform", "translate(" + (2*padding-15) + "," + (h - padding - 15) + ")")
.call(xAxis); // let the axis do its thing
svg.append('path')
.data([data])
.attr("class","line")
.attr('d', valueline)
.attr('stroke', "grey")
.attr('stroke-width', 1)
.style('fill', "white")
.attr("transform","translate(" + (2*padding - 13) + "," + (padding -10) + ")")
.transition()
.duration(3000)
.attr('d', valueline2 );
var svg = d3.select('#svgHourly');
var rects = svg.selectAll('circle')
.data(data);
var newRects = rects.enter();
newRects.append('circle')
.attr('cx', function(d, i) { return (Math.random() * (w - 2*padding)) })
.attr('cy', h - 2*padding)
.attr('r', 5)
.attr("id", function(d,i){return "circle" + i})
.style('fill', "lightblue")
.attr("transform","translate(" + (2*padding - 18) + "," + (padding - 20) + ")")
.transition()
.duration(3000)
.delay(function(d, i) {return i * 300})
.attr('cx', function(d, i) { return (5 + xScale(d.date)); })
.attr('cy', function(d, i) { return 10 + yScale(d.temp); });
}); // closes getJSON()
var数据=[];
$.getJSON(“data/data.json”,
功能(信息){
数据=信息[0]。五个最小读数;
//控制台日志(数据);
var parseTime=d3.timeParse(“%Y-%m-%d%H:%m:%S.%L”);
data.forEach(函数(d){
d、 date=d.date.slice(0,-3);//删除微秒
d、 日期=解析时间(d.日期);
d、 温度=+d温度;
});
//开始5分钟读数的图表
var=25;
var w=600;
var h=300;
var xScale=d3.scaleTime()
.domain(d3.extent(数据,函数(d){返回d.date;}))
.range([0,(w-2*填充)];//最大x屏幕空间为宽度-两倍填充
var yScale=d3.scaleLinear()
.domain([0,d3.max(数据,函数(d){返回d.temp})])
.range([(h-2*填充),0]);//最大y屏幕空间为高度-两倍填充
var xAxis=d3.axisBottom(xScale)//d3 v.4
.tickFormat(d3.timeFormat(“%H:%M”))
.比例(xScale);
var yAxis=d3.axisLeft(yScale)
.比例尺(yScale);
var svg=d3。选择(“#五分钟读数”)
.append('svg')//创建一个元素
.attr('id','svgHourly'))
.attr(“对齐”、“居中”)
.attr('width',w)//设置其尺寸
.attr('高度',h);
var valueline=d3.line()
.曲线(d3.曲线中心)
.x(函数(d){return xScale(d.date);})
.y(h-2*填充-4);
var valueline2=d3.line()
.曲线(d3.曲线中心)
.x(函数(d){return xScale(d.date);})
.y(函数(d){返回yScale(d.temp);});
svg.append(“text”)//x轴的文本标签
.attr(“x”,310)
.attr(“y”,h)
.style(“字体大小”、“12”)
.style(“文本锚定”、“中间”)
.文本(“时间(5分钟间隔)”;
svg.append(“text”)//x轴的文本标签
.attr('transform'、'rotate(-90'))
.attr(“x”,-85)//因为旋转是第一位的,所以x和y坐标是反作用的
.attr(“y”,填充-17)
.style(“字体大小”,“10”)
.style(“文本锚定”、“中间”)
.文本(“临时Celcius”);
svg.append(“g”)
.attr(“类”、“轴”)
.attr(“转换”、“转换”(+(2*padding-15)+)、“+(padding-15)+”)
.呼叫(yAxis);
append('g')//创建一个元素
.attr('class','axis')//指定类
.attr(“转换”、“转换”(+(2*padding-15)+),“+(h-padding-15)+”)
.call(xAxis);//让轴心做它自己的事
append('path')
.数据([数据])
.attr(“类”、“行”)
.attr('d',valueline)
.attr('笔划',“灰色”)
.attr('笔划宽度',1)
.style(“填充”、“白色”)
.attr(“转换”、“转换”(+(2*padding-13)+)、“+(padding-10)+”)
.transition()
.持续时间(3000)
.attr('d',valueline2);
var svg=d3.选择('svgHourly');
var rects=svg.selectAll('circle')
.数据(数据);
var newRects=rects.enter();
newRects.append('circle')
.attr('cx',函数(d,i){return(Math.random()*(w-2*padding))}
.attr('cy',h-2*填充)
.attr('r',5)
.attr(“id”,函数(d,i){返回“圆”+i})
.style('填充',“浅蓝色”)
.attr(“转换”、“转换”(+(2*padding-18)+)、“+(padding-20)+”)
.transition()
.持续时间(3000)
.delay(函数(d,i){返回i*300})
.attr('cx',函数(d,i){return(5+xScale(d.date));})
.attr('cy',函数(d,i){return 10+yScale(d.temp);});
}); // 关闭getJSON()
您可以清楚地看到,您的圆得到的是正确的y(“cy”)值,错误在于x(“cx”)值
问题似乎是在Safari中使用newdate()
时使用了以下模式:yyyy-MM-dd
在您的代码中,给定您的数据结构,您将在line generator中得到如下结果:
.x(function(d) {
return xScale(new Date("2016-12-15 23:01:01.963714"));
})//the first date in your data ---^
你的圈子也是这样:
.attr('cx', function(d, i) {
return (5 + xScale(new Date("2016-12-15 23:01:01.963714")));
})
显然,Chrome和Firefox支持这一点,但Safari不支持。奇怪的是,模式(yyyy-MM-dd
)包含在中,因此这可能是Safari特有的问题
根据,如果您包含一个T
(我没有测试它),它将起作用:
或者,删除newdate()
并使用D3解析日期(D3.timeParse()
在D3 v4.x中,以及format.parse()
在D3 v3.x中)
编辑:总结一下,您有两种可能的解决方案:
解决方案1:删除所有newdate
函数(在线生成器上和使用它的所有刻度中),并使用d3解析日期。您使用的是D3V3.x,但您的代码使用的是D3V4.x。然而,下面是如何使用d3 v3.x来实现这一点:
var date=“2016-12-14 22:01:01.799830”。切片(0,-3);
var format=d3.time.format(“%Y-%m-%d%H:%m:%S.%L”);
var myDate=format.parse(日期);
console.log(myDate)代码>
似乎
.attr('cx', function(d, i) {
return (5 + xScale(new Date("2016-12-15 23:01:01.963714")));
})
.x(function(d) {
return xScale(new Date("2016-12-15T23:01:01.963714"));
})
var commonDate = item.created_at.replace(/\s/, "T");
var date = new Date(commonDate);