- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试创建一种散点图形式。我有一个自定义的 x 轴和两个 a 轴的特定比例。我也为它实现了缩放功能。到目前为止一切都很好,但是当我最终尝试将我的数据绘制为圆圈时,出现了两个错误:
.
我的图可以在这个网站上看到:http://servers.binf.ku.dk/hemaexplorerbeta/(圆圈很大,因为我想确保在设计它们之前大致知道它们的位置)
我根据从 MYSQL 服务器读取的数据创建我的圈子。我检查了我所有的数据,数字是正确的。他们要么绘制错误,要么我的比例/缩放有问题。
您可能还会注意到,我最初使用一些值创建轴和比例,然后立即在某些函数中更改它们。这是因为我计划在网站上加载一个空图,用户可以在其中决定要加载的数据集,其中的函数必须为要加载的数据自定义比例和轴。
我已经在下面粘贴了我的源代码:
//Setting generic width and height values for our SVG.
var margin = {top: 60, right: 0, bottom: 70, left: 40},
genWidth = 1024;
genHeight = 768;
width = genWidth - 70 - margin.left - margin.right,
height = genHeight - 100 - margin.top - margin.bottom;
//Other variable declarations.
var valueY = 0;
var graphData = Array();
//Creating scales used to scale everything to the size of the SVG.
var xScale = d3.scale.linear()
.domain([0, genWidth])
.range([0, width-margin.right]);
var yScale = d3.scale.linear()
.domain([0, genHeight])
.range([height, margin.bottom]);
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left");
//Zoom command ...
var zoom = d3.behavior.zoom()
.x(xScale)
.y(yScale)
.scaleExtent([1,10])
.on("zoom", zoomTargets);
// The mark '#' indicates an ID. IF '#' isn't included argument expected is a tag such as "svg" or "p" etc..
var SVG = d3.select("#mainSVG")
.attr("class", "SVG")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.attr("pointer-events", "all")
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
//This creates a body with a clippath inside the svg where all element in the graph will be. This prevents elemnts on the graph to go past the axis.
var SVGbody = SVG.append("g")
.attr("clip-path", "url(#clip)")
.call(zoom);
//Create background. The mouse must be over an object on the graph for the zoom to work. The rectangle will cover the entire graph.
var rect = SVGbody.append("rect")
.attr("width", width)
.attr("height", height);
//Showing the axis that we created earlier in the script for both X and Y.
SVG.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.selectAll("text")
.style("text-anchor", "end")
.attr("transform", function(d) {
return "rotate(-30)"
});;
SVG.append("g")
.attr("class", "y axis")
.call(yAxis);
d3.json("getdata.php?type=load&gene=CCL5&data=human", function(error, data) {
var arrayValues = [];
if(error){ return console.log(error); }
data.forEach( function(d) {
arrayValues.push(d.gene_name);
valueY = getValueY(d.gene_data);
var string = JSON.stringify(d.gene_data);
graphData.push(string.split(" "));
});
//console.log(graphData);
arrayValues = removeDuplicatesInPlace(arrayValues);
updateScaleX(arrayValues.length);
updateAxisX(arrayValues);
//console.log(arrayValues);
updateScaleY(valueY);
//This selects 4 circles (non-existent, there requires data-binding) and appends them all below enter.
//The amount of numbers in data is the amount of circles to be appended in the enter() section.
for(var i = 0;i <= graphData.length;i++){
var circle = SVGbody
.selectAll("circle")
.data(graphData[i])
.enter()
.append("circle")
.attr("cx",function(d){return xScale((i*100)+100);})
.attr("cy",function(d){return yScale(d)})
.attr("r",20);
}
});
//Clipping is defined here used to prevent elements from the graph from going past the axis.
var clip = SVG.append("defs").append("svg:clipPath")
.attr("id", "clip")
.append("svg:rect")
.attr("id", "clip-rect")
.attr("x", "0")
.attr("y", "0")
.attr("width", width)
.attr("height", height);
//Resets zoom when click on circle object. Zoom work now, should be changed to a button instead of click on circle though.
SVG.selectAll("circle").on("click", function() {
zoom.scale(1);
zoom.translate([0,0]);
zoomTargets();
});
//The function handleling the zoom. Nothing is zoomed automatically, every elemnt must me defined here.
function zoomTargets() {
var translate = zoom.translate(),
scale = zoom.scale();
tx = Math.min(0, Math.max(width * (1 - scale), translate[0]));
ty = Math.min(0, Math.max(height * (1 - scale), translate[1]));
//This line applies the tx and ty which prevents the graphs from moving out of the limits. This means it can't be moved until zoomed in first.
zoom.translate([tx, ty]);
SVG.select(".x.axis").call(xAxis)
.selectAll("text")
.style("text-anchor", "end")
.attr("transform", function(d) {
return "rotate(-30)"
});
SVG.select(".y.axis").call(yAxis);
SVG.selectAll("circle").attr("cx",function(d){return xScale(d)}).attr("cy",function(d){return yScale(d)});
}
function resetZoom() {
zoom.scale(1);
zoom.translate([0,0]);
zoomTargets();
}
function updateAxisX(arr) {
var formatAxis = function(d, i) { return arr[i]; }
xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.tickValues(createTickValuesArray(arr.length))
.tickFormat(formatAxis);
SVG.select(".x.axis")
.call(xAxis)
.selectAll("text")
.style("text-anchor", "end")
.attr("transform", function(d) {
return "rotate(-30)"
});
}
function updateScaleX(newWidth){
genWidth = newWidth;
xScale = d3.scale.linear()
.domain([0, (newWidth*100)+50])
.range([0, width-margin.right]);
SVG.selectAll("circle").attr("cx",function(d){return xScale(d)}).attr("cy",function(d){return yScale(d)});
zoom.x(xScale);
}
function updateScaleY(newHeight){
console.log(newHeight);
var yScale = d3.scale.linear()
.domain([0, newHeight])
.range([height, margin.bottom]);
yAxis = d3.svg.axis()
.scale(yScale)
.orient("left");
SVG.select(".y.axis").call(yAxis);
SVG.selectAll("circle").attr("cx",function(d){return xScale(d)}).attr("cy",function(d){return yScale(d)});
zoom.y(yScale);
}
function createTickValuesArray(amountOfTicks){
var tickValuesArr = [];
for(var i = 1;i<=amountOfTicks;i++){
tickValuesArr[i-1] = 100*i;
}
return tickValuesArr;
}
function getValueY(coordinates){
return d3.max(coordinates, Number);
}
//Custom functions used for specific uses.
var removeDuplicatesInPlace = function (arr) {
var i, j, cur, found;
for (i = arr.length - 1; i >= 0; i--) {
cur = arr[i];
found = false;
for (j = i - 1; !found && j >= 0; j--) {
if (cur === arr[j]) {
if (i !== j) {
arr.splice(i, 1);
}
found = true;
}
}
}
return arr;
};
最佳答案
graphData
中每个数组的第一个和最后一个元素在解析为数字时由于附加引号而导致错误
例如,graphData
的第七个数组如下所示:
console.log(graphData[6]) // [""5.149230", "4.965121""]
原因似乎是在获取数据时不必要的 JSON.stringfiy()
调用
d3.json("getdata.php?type=load&gene=CCL5&data=human", function(error, data) {
var arrayValues = [];
if(error){ return console.log(error); }
data.forEach( function(d) {
arrayValues.push(d.gene_name);
valueY = getValueY(d.gene_data);
var string = JSON.stringify(d.gene_data); // <-- this one
graphData.push(string.split(" "));
});
d.gene_data
已经是一个字符串,因此当您删除 JSON.stringify()
关于javascript - 使用 D3.js 的 <circle> 属性 cx =“NaN” 的值无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22846599/
我把圆圈旋转了180度,我怎样才能让内圈粘在上面(不旋转它) 最佳答案 试试这个代码。我创建了我的 HTML 代码。您的类(class)只需更改即可。 CSS: .outer-circle{
我正在制作一个圆圈到圆圈的碰撞检测程序。我可以让球四处移动,但是当检测到碰撞时,球重叠得很远。有什么建议么?提前致谢! import javax.swing.*; import java.awt.*;
这是圆类: public class Circle { private double radius; private double x; private double y; }
我正在制作一个 HTML Canvas 演示,以了解有关圆到圆碰撞检测和响应的更多信息。我相信检测代码是正确的,但响应数学并不完全正确。 该演示是使用 TypeScript 实现的,它是 JavaSc
所以我想在 CSS 中找出一个反圆/切出的圆。目前我找到 this answer 由 ScottS . 他的代码非常适合我,现在我正在寻找相同的效果,但在 的另一边元素。因此,我需要在右侧切出而不是
我目前正尝试在 C++ 中创建一个 Circle 类,但是当我编译时,我收到一条错误消息,提示“重载的‘Circle’调用不明确。我是 C++ 的新手,不确定这意味着什么。我一直在使用在这里可以找到一
在我的 wip 游戏中,我必须实现 Circle-Circle 碰撞。为了实现这一点,我只需计算它们的中心 (x1-x2)² + (y1-y2)² 之间的平方距离。如果它小于它们的平方半径 (r1+r
我必须画一个倒数计时器圆圈,我正在使用 this open source图书馆。要求是圆圈充满绿色并在 x 秒内消失。我已经给回圆圈绿色并在其上画了一个白色圆圈,绿色圆圈看起来正在消失。 self.c
我有一个 UIView,我将其背景设为圆形: self.colourView.layer.cornerRadius = 350 self.colourView.clipsToBounds = tr
引用: http://tympanus.net/Development/IconHoverEffects/#set-7 当您滑过上面链接中的任何圆圈图标时,它会以曲线形式淡化(我相信这是弹出的圆圈后面
我想创建一个形状,我将其描述为“反圆”: 图片有点不准确,因为黑线应该沿着 div 元素的外边界继续。 这是我目前拥有的演示:http://jsfiddle.net/n9fTF/ 没有图像的 CSS
我可以将文本添加到我的草图中,但如果我可以将文本直接附加到圆圈上,我会希望它。这意味着如果一个圆圈被另一个圆圈覆盖,文本也会被覆盖。在更高的层面上不是,我发现 d3 模型很难以某种方式构造对象,使它们
我正在展示用 Python 的 Turtle 模块绘制的孙子图案,他要求看同心圆。我认为使用 turtle 的 circle() 会更快画他们而不是编写自己的代码来生成圆。哈!我被困住了。我看到所产生
我正在创建一个使用 map 的网络应用程序。在 map 上我正在创建圆圈并希望在 div 中显示半径。通过覆盖完成事件完成半径后,我能够显示半径。但我想在创建圆时显示 div 中的半径,以允许用户以自
编辑:我可以用半径除以 Angular 吗? 问题:为了学习 HTML5 Canvas 中的碰撞艺术,我目前正在尝试让整圆与分段圆(在本例中为半圆)发生碰撞。 我尝试过的:我的第一个想法是一个简单的圆
我发现了其他标题相似的话题,但在这些话题中找不到适合我的解决方案。 我试图通过将相等的宽度/高度与 border-radius:50% 相结合来生成完美圆形的输入标签,但边缘出现像素化。我已经为宽度/
我使用 Google Maps V3 API 创建了一个圆,还尝试制作了一个具有相同半径的标记圆。 问题:我创建的是倾斜的,而谷歌地图创建的是一个漂亮的圆圈。出了什么问题? Google map V3
这是我一直在处理的图像 目标是检测大圆圈内的小圆圈。 目前我所做的是将图像转换为灰度并应用阈值(cv2.THRESH_OTSU),从而产生此图像 在此之后,我使用我在stackoverflow上找到的
我正在尝试绘制一张图片,并且绘制了一个矩形,然后我想绘制一个弧形元素,但是这个元素必须是精确的,并且它只是矩形之外的圆的一部分形状。因此,我尝试使用 Arc patch 来创建相同的东西,但形状不匹配
我必须检测 javaFX 程序中两个“球”何时发生碰撞。每次单击按钮时,都会将一个新球添加到 Pane 中。我知道 getChildren() 返回一个可观察列表,其中包含每个球的节点,当我打印带有两
我是一名优秀的程序员,十分优秀!