gpt4 book ai didi

javascript - 如何将json变量加载到D3中?

转载 作者:行者123 更新时间:2023-11-30 20:03:34 25 4
gpt4 key购买 nike

我是 D3 的新手。我有这个很好example of a candlestick chart从 csv 文件加载数据。我得到了那个例子,但现在我想做同样的事情,除了从返回 json 数据的 ajax 调用加载数据。我不知道该怎么做。

在阅读了一些评论之后,这是我的第二次尝试:

function showChart() {
var margin = {top: 20, right: 20, bottom: 30, left: 50},
width = $(window).width()*0.6 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var parseDate = d3.timeParse("%Y-%m-%d");
var x = techan.scale.financetime().range([0, width]);
var y = d3.scaleLinear().range([height, 0]);
var candlestick = techan.plot.candlestick()
.xScale(x)
.yScale(y);
var xAxis = d3.axisBottom().scale(x);
var yAxis = d3.axisLeft().scale(y);

$.ajax("http://www.mycom.net/getQuoteHistory.php?symbol='A'", {
success: function(data) {
console.log("getQuoteHistory:data="+JSON.stringify(data));
var accessor = candlestick.accessor();
data = JSON.parse(data);

var newData = [];
for (var i=0; i<data.length; i++) {
var o = data[i];
var newObj = {};
newObj.date = parseDate(o.Date);
newObj.open = o.Open;
newObj.high = o.High;
newObj.low = o.Low;
newObj.close = o.Close;
newObj.volume = o.Volume;
newData.push(newObj);
}
console.log("getQuoteHistory:newData="+JSON.stringify(newData));
var svg = d3.select("svg")
.data(newData)
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.append("g").attr("class", "candlestick");
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")");
svg.append("g")
.attr("class", "y axis")
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Price ($)");

// Data to display initially
draw(newData.slice(0, newData.length-20));
// Only want this button to be active if the data has loaded
d3.select("button").on("click", function() {
draw(newData);
}).style("display", "inline");
},
error: function() {
console.log("something went wrong in ajax call");
}
});
function draw(data) {
x.domain(data.map(candlestick.accessor().d));
y.domain(techan.scale.plot.ohlc(data, candlestick.accessor()).domain());

svg.selectAll("g.candlestick").datum(data).call(candlestick);
svg.selectAll("g.x.axis").call(xAxis);
svg.selectAll("g.y.axis").call(yAxis);
}
}

ajax 调用返回良好的 json 数组数据,并将其转换为 newData,其中日期解析正确,字段名称小写为 reqd。以下是每个片段:

getQuoteHistory:data="[{\"Symbol\":\"A\",\"Date\":\"2018-06-28\",\"Open\":\"61.13\",\"High\":\"61.64\",\"Low\":\"60.42\",\"Close\":\"61.29\",\"Volume\":\"15641\"},{\"Symbol\":\"A\",\"Date\":\"2018-06-29\",\"Open\":\"61.68\",\"High\":\"62.47\",\"Low\":\"61.57\",\"Close\":\"61.84\",\"Volume\":\"18860\"},

getQuoteHistory:newData=[{"date":"2018-06-28T06:00:00.000Z","open":"61.13","high":"61.64","low":"60.42","close":"61.29","volume":"15641"},{"date":"2018-06-29T06:00:00.000Z","open":"61.68",

现在失败发生在这一行的绘制函数中:

svg.selectAll("g.candlestick").datum(data).call(candlestick);  

chrome javascript 控制台显示“svg 未定义”。

但是它是在html中定义的:

    <svg></svg>

即使我将 svg 作为参数传递给 draw 方法,它也会显示“无法读取未定义的属性 selectAll”。

关于如何从 json 数组而不是 csv 文件让它工作的任何想法?

最佳答案

您需要在function draw(data) 中重新选择您的svg,因为您的变量var svg 是一个仅定义的局部变量在您的 ajax 调用的 success 函数中。

只需添加:

function draw(data) {
var svg = d3.select("svg");
// The rest of your function
}

关于javascript - 如何将json变量加载到D3中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com