这是我的d3js代码
function ShowGraph(data) {
d3.selectAll('.axis').remove();
var vis = d3.select("#visualisation"),
WIDTH = 500,
HEIGHT = 500,
MARGINS = {
top: 20,
right: 20,
bottom: 20,
left: 30
},
xRange = d3.scale.linear().range([MARGINS.left, WIDTH - MARGINS.right]).domain([d3.min(data, function (d) {
return d.year;
}),
d3.max(data, function (d) {
return d.year;
})]),
yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([d3.min(data, function (d) {
return d.count;
}),
d3.max(data, function (d) {
return d.count;
})]),
xAxis = d3.svg.axis() // generate an axis
.scale(xRange) // set the range of the axis
.tickSize(5) // height of the ticks
.tickSubdivide(true), // display ticks between text labels
yAxis = d3.svg.axis() // generate an axis
.scale(yRange) // set the range of the axis
.tickSize(5) // width of the ticks
.orient("left") // have the text labels on the left hand side
.tickSubdivide(true); // display ticks between text labels
var transition = vis.transition().duration(1000).ease("exp-in-out");
transition.select(".x.axis").call(xAxis);
transition.select(".y.axis").call(yAxis);
vis.append("svg:g") // add a container for the axis
.attr("class", "x axis") // add some classes so we can style it
.attr("transform", "translate(0," + (HEIGHT - MARGINS.bottom) + ")") // move it into position
.call(xAxis); // finally, add the axis to the visualisation
vis.append("svg:g")
.attr("class", "y axis")
.attr("transform", "translate(" + (MARGINS.left) + ",0)")
.call(yAxis);
var circles = vis.selectAll("circle").data(data)
circles.enter()
.append("svg:circle")
.attr("cx", function (d) {
return xRange(d.year);
})
.attr("cy", function (d) {
return yRange(d.count);
})
.style("fill", "red")
circles.transition().duration(1000)
.attr("cx", function (d) {
return xRange(d.year);
})
.attr("cy", function (d) {
return yRange(d.count);
})
.attr("r", 10)
circles.exit()
.transition().duration(1000)
.attr("r", 10)
.remove();
}
使用的数据是
[{"count": "202", "year": "1590"},
{"count": "215", "year": "1592"},
{"count": "179", "year": "1593"},
{"count": "199", "year": "1594"},
{"count": "134", "year": "1595"},
{"count": "176", "year": "1596"},
{"count": "172", "year": "1597"},
{"count": "161", "year": "1598"},
{"count": "199", "year": "1599"},
{"count": "181", "year": "1600"},
{"count": "157", "year": "1602"},
{"count": "179", "year": "1603"},
{"count": "150", "year": "1606"},
{"count": "187", "year": "1607"},
{"count": "133", "year": "1608"},
{"count": "190", "year": "1609"},
{"count": "175", "year": "1610"},
{"count": "91", "year": "1611"},
{"count": "150", "year": "1612"}
]
图表的y轴如下所示(按从上到下的顺序)
使用的数据是
[{"count": "841", "year": "1590"},
{"count": "848", "year": "1592"},
{"count": "579", "year": "1593"},
{"count": "753", "year": "1594"},
{"count": "612", "year": "1595"},
{"count": "740", "year": "1596"},
{"count": "762", "year": "1597"},
{"count": "894", "year": "1598"},
{"count": "937", "year": "1599"},
{"count": "995", "year": "1600"},
{"count": "715", "year": "1602"},
{"count": "786", "year": "1603"},
{"count": "680", "year": "1606"},
{"count": "942", "year": "1607"},
{"count": "525", "year": "1608"},
{"count": "779", "year": "1609"},
{"count": "717", "year": "1610"},
{"count": "421", "year": "1611"},
{"count": "738", "year": "1612"}
]
图表的y轴如下所示(按从下到上的顺序排列)
任何人都可以指出我可能是什么原因以及如何纠正这种行为。 的 更新
另一个测试数据样本
[{"count": "357", "year": "1608"},
{"count": "375", "year": "1611"},
{"count": "506", "year": "1606"},
{"count": "535", "year": "1610"},
{"count": "551", "year": "1612"},
{"count": "660", "year": "1597"},
{"count": "679", "year": "1594"},
{"count": "689", "year": "1598"},
{"count": "873", "year": "1595"},
{"count": "891", "year": "1592"},
{"count": "990", "year": "1607"},
{"count": "1031", "year": "1593"},
{"count": "1038", "year": "1602"},
{"count": "1064", "year": "1609"},
{"count": "1264", "year": "1600"},
{"count": "1357", "year": "1596"},
{"count": "1616", "year": "1590"},
{"count": "2299", "year": "1599"},
{"count": "2559", "year": "1603"}]
答案 0 :(得分:2)
如果您在渲染第一组数据时发现, y轴看起来不太合适。根据数据,分count
为91
,最大为215
,但 y轴最多为130
。
这是因为在构建比例并计算最小值和最大值时,会将值作为字符串进行比较。
要修复它,您需要修改数据数组以在需要的地方使用数值
[{ "count": 202, "year": 1590},
{ "count": 215, "year": 1592} /*....*/]
或者在构建比例时将它们解析为parseInt
的整数 - 并且不要忘记将基数传递给parseInt
。
如果选择后者,只需将您的比例修改为:
/*....*/},
xRange = d3.scale
.linear()
.domain([
d3.min(data, function(d){ return parseInt(d.year, 10);}),
d3.max(data, function(d){ return parseInt(d.year, 10);})
])
.range([MARGINS.left, WIDTH - MARGINS.right]),
yRange = d3.scale
.linear()
.domain([
d3.min(data, function(d){ return parseInt(d.count, 10);}),
d3.max(data, function(d){ return parseInt(d.count, 10);})
])
.range([HEIGHT - MARGINS.top, MARGINS.bottom]),
这是JSFiddle:http://jsfiddle.net/jaimem/RPGPL/2/