我试图在d3中的烛台图表中获得高低关闭和打开一个烛台的值。在鼠标悬停时我想要这些值。为此,我需要唯一地标识每个烛台,以便在鼠标悬停时我可以获得该特定烛台的值。我的代码如下。 我尝试将group元素附加到每个烛台但是没有成功。
$(document).ready(function () {
//alert("In document ready");
var option = '<option value="0">--select --</option>'; //filling the drop down for company list
d3.csv("companies.csv", function (data) {
//var z = "a.us.txt";
//console.log(data.z);
for (var i = 0; i < data.length; i++) {
// console.log(data[i].companies);
option += '<option Value="' + data[i].companies + '">' + data[i].companies + '</option>'
}
$('#det').html(option);
});
createCandleStickChart(); // Creating candle chart
})
var margin, width, height, parseDate, x, y, candlestick, xAxis, yAxis, svg;
var link = "https://raw.githubusercontent.com/Diksha1206/Stocks-Viz/master/Data/";
var selectedcompany;
function createCandleStickChart() {
margin = { top: 20, right: 20, bottom: 30, left: 50 }, //Setting margin width and height
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
parseDate = d3.timeParse("%Y-%m-%d"); // Parsing the data as year month and day
x = techan.scale.financetime() // Scaling a axis.Setting x from 0 to width defined
.range([0, width]); //techan.scale.financetime plots only points available in the data's date domain without linear (weekend, market holiday) gaps.
y = d3.scaleLinear() // Scaling y-axis to Linear timescale
.range([height, 0]);
candlestick = techan.plot.candlestick() //techan.plot.candlestick - construct a candlestick.
.xScale(x)
.yScale(y);
xAxis = d3.axisBottom() //Creating x-axis
.scale(x);
yAxis = d3.axisLeft() //Creating y axis
.scale(y);
svg = d3.select("#candle").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
svg.on("brush", function (value) {
alert("Clicked in brush");
})
}
$('select[name="Companydropdown"]').change(function () {
document.getElementById("candle").innerHTML = "";
selectedcompany = $(this).val();
var linktogo = link + selectedcompany;
//alert(linktogo);
createCandleStickChart();
d3.csv(linktogo, function (error, data) { //providing the link of the selected data from the dropdown
var accessor = candlestick.accessor();
data = data.slice(0, 200).map(function (d) {
return {
date: parseDate(d.Date),
open: +d.Open,
high: +d.High,
low: +d.Low,
close: +d.Close,
volume: +d.Volume
};
}).sort(function (a, b) { return d3.ascending(accessor.d(a), accessor.d(b)); });
//svg.selectAll('.candlestick')
//.data(data)
//.enter().append('g')
//.attr('class', 'candlestick')
//.on('mouseover', function (d) {
// console.log(d);
//})
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 ($)");
draw(data.slice(0, data.length - 20));
d3.select("button").on("click", function () { draw(data); }).style("display", "inline");
});
})
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).append("g").call(candlestick).on('mouseover', function (d) {
alert("Mouseover");
console.log("clicking on", d);
});
svg.selectAll("g.x.axis").call(xAxis);
svg.selectAll("g.y.axis").call(yAxis);
}
我从下拉列表中选择一家公司,然后根据选择更改数据。有什么方法可以让我在鼠标悬停时获得一个烛台的价值吗?
答案 0 :(得分:0)
我猜测您的代码,您使用类似于http://bl.ocks.org/andredumas/27c4a333b0e0813e093d的内容
所以它基本上是paths
附加的,看起来像烛台。要获取鼠标悬停的值,您必须使用数据和鼠标位置对值进行二等分并获取相应的值。以下是:
var x0 = x.invert(d3.mouse(this)[0]),
i = bisectDate(data, x0, 1),
d0 = data[i - 1],
d1 = data[i],
d = x0 - d0.date > d1.date - x0 ? d1 : d0;
当然,使用马克的https://bl.ocks.org/mbostock/3902569作为参考。修改了相同的内容并使用该值在此处添加工具提示,这是一个显示我是如何完成它的分支。
我不确定您是否确实要添加工具提示,但您可以看到提取的值。
希望这会有所帮助。