交换时间和线性缩放取决于用户选择
Interchange time and linear scaling depending on user selection
我正在构建一个小部件,让用户决定要根据什么量绘制什么量(在bl.ocks上构建这个动画散点图。这对数字量很好,但我也有日期量,我希望用户也能以同样的方式根据非日期量绘制这些量。
原始线性缩放和轴的设置方式类似于全局函数:
var xScale = d3.scale.linear() // xScale is width of graphic
.domain([0, d3.max(dataset, function(d) {
return d[0]; // input domain
})])
.range([padding, canvas_width - padding * 2]); // output range
var yScale = d3.scale.linear() // yScale is height of graphic
.domain([0, d3.max(dataset, function(d) {
return d[1]; // input domain
})])
.range([canvas_height - padding, padding]); // remember y starts on top going down so we flip
// Define X axis
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(5);
// Define Y axis
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(5);
我希望我可以在click
函数中修改这些全局变量,甚至改变缩放的性质,这也会反馈到轴变量中,所以我把它放在了点击函数中:
if(types[xName]==3){
console.log("resetting x scale to time type");
xScale = d3.time.scale().range([padding, canvas_width - padding * 2]); // output range
}
else{
// Create scale functions
xScale = d3.scale.linear() // xScale is width of graphic
.domain([0, d3.max(dataset, function(d) {
return d[0]; // input domain
})])
.range([padding, canvas_width - padding * 2]); // output range
}
xScale.domain([0, d3.max(dataset, function(d) {
return d[0]; })]);
if(types[xName] == 1){
xScale.domain([d3.max(dataset, function(d) {
return d[0]; }), 0]);
}
if(types[yName]==3){
console.log("resetting y scale to time type");
yScale = d3.time.scale().range([canvas_height - padding, padding]); // remember y starts on top going down so we flip
}
else {
yScale = d3.scale.linear() // yScale is height of graphic
.domain([0, d3.max(dataset, function(d) {
return d[1]; // input domain
})])
.range([canvas_height - padding, padding]); // remember y starts on top going down so we flip
}
yScale.domain([0, d3.max(dataset, function(d) {
return d[1]; })]);
if(types[yName] == 1){
yScale.domain([d3.max(dataset, function(d) {
return d[1]; }), 0]);
}
当数据是日期数据时,我也会在数据上适当地使用parseDate
。上面(完整的代码在这里,小部件在这里,有问题的日期类型存储在Created
中)当我选择日期类型时,将所有点放在某个疯狂的位置,所有点都在图上的一条直线上,更糟糕的是,仍然会产生以下错误:
Error: Invalid value for <circle> attribute cx="naN" where I assume this is giving an error from the following code:
svg.selectAll("circle")
.data(dataset) // Update with new data
.transition() // Transition from old to new
.attr("cx",函数(d){return xScale(d[0]);//圆圈的X})
因此,我假设xScale
在转换为时间刻度时根本不起作用。我做错了什么?感谢您的任何更正或故障排除建议。
cx计算为NaN,因为您存储的数据创建了,如时间戳示例:"created":1447686953
,并且您正在编写一个解析日期函数。
var parseDate = d3.time.format("%Y%m%d").parse;
这是不正确的,因为日期不是20151223格式。
所以你建议的量表计算错误。
if(types[xName]== 3){
newNumber1 = parseDate(String(data[i][xName]));//this is wrong
}
var newNumber2 = data[i][yName]/divisor[types[yName]]//Math.floor(Math.random() * maxRange); // New random integer
if(types[yName]== 3){
newNumber2 = parseDate(String(data[i][yName]));//this is wrong
}
所以你需要这样做才能转换成日期:
if(types[xName]== 3){
newNumber1 = new Date(data[i][xName]*1000);
}
var newNumber2 = data[i][yName]/divisor[types[yName]]//Math.floor(Math.random() * maxRange); // New random integer
if(types[yName]== 3){
newNumber2 = new Date(data[i][yName]*1000);
}
希望这能有所帮助!
相关文章:
- 我想创建一个长度取决于用户输入的数组,然后尝试找到数组中所有数字的总和
- 脚本中的变量取决于用户输入的文本字段
- 如何动态创建集合名称(取决于用户信息)
- 如何排列所选选项取决于用户选择
- 用户取消选择,然后从数组中删除项目并进行排列,具体取决于它们的选择方式
- 我在表单页面上有一个弹出窗口以及一个隐藏元素,具体取决于用户输入.两者都使用 jquery
- 是否可以让JS函数的返回取决于用户操作
- (多选)排列选项取决于用户的选择
- 护照 JS - 一个登录表单 - 重定向到不同的 URI,具体取决于用户角色
- Javascript自定义排序功能取决于用户输入
- 进度条取决于用户输入
- 动态js的答案取决于用户的输入
- 如何包含php文件取决于用户选择的内容
- 交换时间和线性缩放取决于用户选择
- 更改取决于用户是否选择“是”;或“;No"
- 显示/隐藏下载按钮取决于用户是否在ios上
- Dijit ValidationTextBox:是否显示invalidMessage,取决于用户首先做什么
- 谷歌chrome应用程序开发允许您添加html和javascript到本地存储的文件,取决于用户
- 具有数据库中特定信息的模式,具体取决于用户单击的位置
- 我想设置文本框的最大长度,这取决于用户对上一个文本框的回答