- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近开始研究 D3.js。我正在开发一个带有双 x 轴的交互式多线图。请看一下我的作品,JSFIDDLE 在这里:http://jsfiddle.net/dalapati/cdkn14j3/1/
data1 = [
{"date": 1357717800000,"value": "5.6"},
{"date": 1357718400000,"value": "5.6"},
{"date": 1357719000000,"value": "6"},
{"date": 1357719600000,"value": "5.1"},
{"date": 1357720200000,"value": "5.3"},
//{"date": 1357720800000,"value": "5.4"}
];
data2 = [
{"date": 1357714800000,"value": "5.2"},
{"date": 1357715400000,"value": "5.2"},
{"date": 1357716000000,"value": "5.2"},
{"date": 1357716600000,"value": "5.1"},
{"date": 1357717200000,"value": "5.5"},
]
// date manipulation to format UTC to js Date obj
data1.forEach(function(d){ d.time = new Date(d.time * 1000);});
data2.forEach(function(d){ d.time = new Date(d.time * 1000);});
// helpers and constants
var margin = {"top": 50, "right": 50, "bottom": 50, "left": 100, "axis": 55};
var width = 1500 - margin.left - margin.right;
var height = 580 - margin.top - margin.bottom;
var timeFormat = d3.time.format("%X");
// find data range
var x1Domain = d3.extent(data1, function(d){ return d.date; });
var x2Domain = d3.extent(data2, function(d){ return d.date; });
var x1Min = d3.min(data1, function(d){ return Math.min(d.date); });
var x1Max = d3.max(data1, function(d){ return Math.max(d.date); });
var x2Min = d3.min(data2, function(d){ return Math.min(d.date); });
var x2Max = d3.max(data2, function(d){ return Math.max(d.date); });
var y1Min = d3.min(data1, function(d){ return Math.min(d.value); });
var y1Max = d3.max(data1, function(d){ return Math.max(d.value); });
var y2Min = d3.min(data2, function(d){ return Math.min(d.value); });
var y2Max = d3.max(data2, function(d){ return Math.max(d.value); });
var yMin = (y1Min < y2Min) ? y1Min:y2Min;
var yMax = (y1Max > y2Max) ? y1Max:y2Max;
// scales
var x1Scale = d3.time.scale()
.domain(d3.extent(data1, function (d) {
return d.date;}))
.range([0, width]);
var x2Scale = d3.time.scale()
.domain(d3.extent(data2, function (d) {
return d.date;}))
.range([0, width]);
var yScale = d3.scale.linear()
.domain([yMin,yMax]).range([height, 0]);
// set up axes
var x1Axis = d3.svg.axis()
.scale(x1Scale)
.orient("bottom")
.ticks(5)
.tickPadding(5)
.tickFormat(timeFormat);
var x2Axis = d3.svg.axis()
.scale(x2Scale)
.orient("top")
.ticks(5)
.tickPadding(5)
.tickFormat(timeFormat);
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(5);
var make_y_axis = function () {
return d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(5);
};
// Set up chart type
// create a line function that can convert data into x and y points
var line1 = d3.svg.line().interpolate("basis")
.x(function (d) {
return x1Scale(d.date);
})
.y(function (d) {
return yScale(d.value);
});
var line2 = d3.svg.line().interpolate("basis")
.x(function (d) {
return x2Scale(d.date);
})
.y(function (d) {
return yScale(d.value);
});
// Create Zoom feature
var zoomBottom = d3.behavior.zoom()
.x(x1Scale)
//.y(yScale);
.scaleExtent([1,10]);
var zoom = d3.behavior.zoom()
.x(x2Scale)
//.y(yScale)
.scaleExtent([1,10])
.on("zoom",zoomed);
// Create Drag behaviour
var drag = d3.behavior.drag()
.origin(function(d){return d;})
.on("dragstart", dragstarted)
.on("drag", dragged)
.on("dragend", dragended)
// create svg container
var svg = d3.select('#chart')
.append("svg:svg")
.attr('width', width + margin.left + margin.right)
.attr('height', height + margin.top + margin.bottom)
.append("svg:g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
.call(zoom);
svg.append("svg:rect")
.attr("width", width)
.attr("height", height)
.attr("class", "plot");
function draw(){
//Draw Axes
svg.append("svg:g")
.attr("class", "x axis axisBottom")
.attr("transform", "translate(0, " + height + ")")
.call(x1Axis);
svg.append("svg:g")
.attr("class", "x axis axisTop")
.attr("transform", "translate(0, 0)")
.call(x2Axis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
// grid plot
svg.append("g")
.attr("class", "y grid")
.call(make_y_axis()
.tickSize(-width, 0, 0)
.tickFormat(""));
// add lines
// do this AFTER the axes above so that the line is above the tick-lines
var clip = svg.append("svg:clipPath")
.attr("id", "clip")
.append("svg:rect")
.attr("x1Scale", 0)
.attr("x2Scale", 0)
.attr("yScale", 0)
.attr("width", width)
.attr("height", height);
var chartBody = svg.append("g")
.attr("clip-path", "url(#clip)");
chartBody.append("svg:path")
.datum(data1)
.attr("class", "data1")
.attr("d", line1(data1))
.attr("cursor", "move")
.call(drag);
chartBody.append("svg:path")
.datum(data2)
.attr("class", "data2")
.attr("d", line2(data2))
.attr("cursor", "move")
.call(drag);
}
draw();
/************************** ADDING ZOOMING FEATURE****************************************/
function zoomed() {
//console.log(d3.event.translate);
//console.log(d3.event.scale);
zoomBottom.scale(zoom.scale()).translate(zoom.translate());
svg.select(".axisBottom").call(x1Axis);
svg.select(".axisTop").call(x2Axis);
svg.select(".y .axis").call(yAxis);
svg.select(".grid").call(make_y_axis().tickSize(-width,0,0).tickFormat(""));
svg.select(".data1").attr("d",line1(data1));
svg.select(".data2").attr("d",line2(data2));
}
/***************** Adding Dragging feature*****************************************************/
function dragstarted(d){
d3.event.sourceEvent.stopPropagation();
d3.select(this).classed("dragging", true);
}
function dragged(d){
var lineToMove = d3.event.x;
console.log(lineToMove);
d3.select(this)
.attr("cx", d[0] = d3.event.sourceEvent.x);
}
function dragended(d){
d3.select(this).classed("dragging", false);
}
正如您所看到的,有两个不同的折线图,取自不同的数据源并相对于两个不同的 x 轴绘制。我正在尝试对每个线图实现拖动行为,如果我选择一个图并拖动它并保持另一个图不变,则相应的轴值也应该更新。
但是当我尝试拖动折线图时,出现 NAN 错误。我不知道如何解决这个错误。有谁知道我哪里出错了。
提前致谢。
最佳答案
问题是当你设置原点时,因为它期望一个带有 x 和 y 的对象。
尝试:
.origin(function(){ var t = d3.select(this); return { x: t.attr('x') , y: t.attr('y') } })
引用How to set the Origin (drag.origin) for drag behavior in d3 JavaScript library
关于javascript - D3.js - 如何解决拖动折线图时出现 NAN 错误(Jsfiddle 提供),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26048791/
这个问题在这里已经有了答案: Adding images in JSfiddle [closed] (3 个回答) 7年前关闭。 我想在 jsfiddle 中使用一个小图像/图标。 我该怎么做?我在某
我曾经能够访问 jsfiddle.net 并加载特定版本的 jquery、angular 或我选择使用的任何库。但现在这一切都过去了。有谁知道发生了什么? :O 最佳答案 在 jsfiddle.net
我一直在使用jsFiddle帮助回答有关 Stack Overflow 的问题,并且一些旧代码/脚本已经开始消失 - 似乎在闲置一定时间后就会过期。 我尝试查看 jsFiddle documentat
jsfiddle 允许在边栏的外部资源 部分导入外部脚本。是否可以在其中导入另一个 jsfiddle 的 javascript? 例如,我可以创建一个名为“A”的 jsfiddle,它创建一个 jav
是否可以选择和复制我在 jsfiddle 中编写的代码? 当我尝试选择代码(Chrome 28.0,Mac OSX)时,一旦我松开鼠标(准鼠标),文本就会被取消选择。 对不起,如果已经有类似的问题,但
我想在 jsFiddle 中展示纯 JavaScript 示例,我只需要一个 JavaScript 窗口和一个控制台。我已经弄清楚如何显示控制台窗口,但是有没有办法删除 HTML 和 CSS 窗口?有
如果我有私有(private)脚本,在“所有 fiddle ”类别中如何将它们移动到“公共(public) fiddle ”类别? 最佳答案 要公开 JSFiddle 脚本: 打开脚本。 打开左侧的“
我刚刚发现了 jsfiddle,我喜欢这个工具并且已经注册了一个帐户。现在我想分享一个我刚刚创建的 fiddle ,但我找不到保存它的网址或按钮,有人能告诉我该怎么做吗?这不可能那么困难,但它让我发疯
在文档中: “保存”或“ fork ”按钮始终出现在用户界面中。如果没有加载 fiddle ,则会出现第一个,后者用于从现有 fiddle 创建一个新 fiddle 。 当 fiddle 是全新的时,
在 jsFiddle 上有什么方法可以将其他用户的公共(public) jsFiddle 代码复制到我的仪表板吗?我可以通过手动复制代码和配置来完成,但我在 jsfiddle.net 上找不到任何选项
我正要问一个关于 JSFiddle 的问题,我注意到图像(我在 Imgur 上得到的)没有出现。如果我直接在浏览器中加载图像,然后重新加载 fiddle ,图片就会显示出来,但如果您尚未加载图片,它们
jsfiddle.net 中有没有办法为代码提供人类可读的名称 片段? 最佳答案 更改 fiddle 名称后无需 fork 您的 fiddle 。您可以使用顶部的 (Set As Base) 选项将其
我真的很喜欢 JSFiddle ,我用了很多。 此刻,我有大约 80 把 fiddle ,我 创建/ fork 在 my JSFiddle dashboard .我要翻8页才能找到具体 用我的眼睛扫视
我认为 jsfiddle 非常简洁,我昨天用它来帮助 stackoverflow 上的某个人。 我创建了一个新 fiddle ,点击“保存”并使用此提供的链接:http://jsfiddle.net/
较早的“设置为基础”按钮在 jsfiddle.net 中。现在它消失了。我使用我的用户名登录。可能是什么原因? 最佳答案 当我在没有登录的情况下开始一个新的 fiddle 时,我遇到了同样的问题(在创
JsFiddle 是我的实验室,但目前一切都停止了,因为我无法在其中工作。我尝试使用为外部链接提供的空间,但无济于事。我什至直接添加了链接,但它仍然不起作用。 我正在进行实验,但无法使其正常工作。将
我试图在 jsFiddle 中包含 Google 字体,但没有成功。我将 URL 添加到“外部资源”,但它包含为 . 这是我想要包含的字体: 最佳答案 Web 字体必须包含在 CSS 象限中,使用
我的简单反网络欺凌插件代码在 JSFiddle 中完美运行,但无法在我的网站上运行,即使我添加了 document.ready 并使用了像 jslint 这样的 c+p 清理器。该代码在 JSFidd
我在这里学习一本书,有一个练习需要 2 个 HTML 文件,我想知道是否可以在我的 JsFidle 中使用 HTML 文件 最佳答案 我不认为这是可能的。但是,您可以使用 Plunker。它非常相似,
我试图了解 Body 标记字段在 JSFiddle 中的作用,但在他们的文档(我能找到)中没有引用它。我问是因为我想控制 body 和 html 标签的 CSS,可能没有样式标签。 最佳答案 文档不是
我是一名优秀的程序员,十分优秀!