- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在三个相似的折线图(相同的数据集)之间画一条垂直线有些困难。
Var testdate1
包含一个日期,可在图表 (lc1.on(renderlet)
函数顶部) 的索引处找到pos 4(折线图上的第 4 个“circle.dot”)。
如何在图表的那个位置添加一条垂直线? (我希望在所有三个折线图的相同位置添加垂直线,但我希望所有三个都采用相同的过程)。
此外,出于某种原因,我无法将那个位置的圆圈设置为红点或绿点,尽管它在 this SO answer by davcs86 中有效。 -- 但在他的示例中,我们使用 x 轴(日期)定位点,并且此代码使用 alldotsN 集合中的索引号 -- 也看不出我在这里做错了什么。
var chartHeight = 250;
var chartWidth = 500;
var myCSV = [
{"shift":"1","date":"01/01/2016/08/00/00/+0500","car":"178","truck":"125","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00/+0500","car":"125","truck":"189","bike":"125","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00/-0500","car":"140","truck":"219","bike":"328","moto":"1252"},
{"shift":"4","date":"02/01/2016/17/00/00/+0500","car":"222","truck":"290","bike":"432","moto":"378"},
{"shift":"5","date":"03/01/2016/08/00/00/+0500","car":"200","truck":"250","bike":"420","moto":"319"},
{"shift":"6","date":"03/01/2016/17/00/00/+0500","car":"230","truck":"220","bike":"310","moto":"413"},
{"shift":"7","date":"04/01/2016/08/00/00/+0500","car":"155","truck":"177","bike":"377","moto":"180"},
{"shift":"8","date":"04/01/2016/17/00/00/+0500","car":"179","truck":"203","bike":"405","moto":"222"},
{"shift":"9","date":"05/01/2016/08/00/00/+0500","car":"208","truck":"185","bike":"360","moto":"195"},
{"shift":"10","date":"05/01/2016/17/00/00/+0500","car":"150","truck":"290","bike":"315","moto":"280"},
{"shift":"11","date":"06/01/2016/08/00/00/+0500","car":"200","truck":"220","bike":"350","moto":"205"},
{"shift":"12","date":"06/01/2016/17/00/00/+0500","car":"230","truck":"170","bike":"390","moto":"400"}
];
var testdate1 = +new Date('Sun Jan 03 2016 08:00:00 GMT-0500 (Eastern Standard Time)');
lc1 = dc.lineChart("#line1");
lc2 = dc.lineChart("#line2");
lc3 = dc.lineChart("#line3");
var dateFormat = d3.time.format("%d/%m/%Y/%H/%M/%S/%Z");
myCSV.forEach(function (d) {
d.date = dateFormat.parse(d.date);
d.car = +d.car;
d.bike = +d.bike;
d.moto = +d.moto;
});
var facts = crossfilter(myCSV);
var dateDim = facts.dimension(function (d) {return d.date});
var carDim = facts.dimension(function (d) {return d['car']});
var dgCar = dateDim.group().reduceSum(function (d) {return d['car']});
var bikeDim = facts.dimension(function (d) {return d['bike']});
var dgBike = dateDim.group().reduceSum(function (d) {return d['bike']});
var motoDim = facts.dimension(function (d) {return d['moto']});
var dgMoto = dateDim.group().reduceSum(function (d) {return d['moto']});
var minDate = myCSV[0].date; //new Date ("2016-01-01T08:00:00.000Z");
var maxDate = myCSV[myCSV.length-1].date; //new Date ("2016-01-06T17:00:00.000Z");
lc1
.renderArea(false)
.width(chartWidth)
.height(chartHeight)
.dimension(dateDim)
.group(dgCar)
.defined(function(d) {if(d.y !==null) {return d.y;}})
.transitionDuration(1000)
.margins({top: 30, right: 20, bottom: 35, left: 60})
.yAxisLabel('Cars')
.renderHorizontalGridLines(true)
.brushOn(false)
.x(d3.time.scale().domain([minDate,maxDate]));
lc1.yAxis().ticks(5);
lc1.xAxis().ticks(3);
lc2
.renderArea(false)
.width(chartWidth)
.height(chartHeight)
.dimension(dateDim)
.group(dgBike)
.defined(function(d) {if(d.y !==null) {return d.y;}})
.transitionDuration(1000)
.margins({top: 30, right: 20, bottom: 35, left: 60})
.yAxisLabel('Bikes')
.renderHorizontalGridLines(true)
.brushOn(false)
.x(d3.time.scale().domain([minDate,maxDate]));
lc2.yAxis().ticks(5);
lc2.xAxis().ticks(3);
lc3
.renderArea(false)
.width(chartHeight)
.height(250)
.dimension(dateDim)
.group(dgMoto)
.defined(function(d) {if(d.y !==null) {return d.y;}})
.transitionDuration(1000)
.margins({top: 30, right: 20, bottom: 35, left: 60})
.yAxisLabel('Motos')
.renderHorizontalGridLines(true)
.brushOn(false)
.x(d3.time.scale().domain([minDate,maxDate]));
lc3.yAxis().ticks(5);
lc3.xAxis().ticks(3);
lc1.on('renderlet', function(lc1) {
var thespot;
var allDots1 = lc1.selectAll('circle.dot');
allDots1.filter(function(d,i){ //d==datum (obj), i==index (of datapoint on line)
if (+d.x===testdate1) thespot = i;
});
console.log('found spot: ' +thespot); //== 4th position on line
//display red circle - NOT WORKING
alldots1.filter((d,i) => i === thespot).classed('reddot',true);
alldots2.filter((d,i) => i === thespot).classed('greendot',true);
alldots3.filter((d,i) => i === thespot).classed('greendot',true);
//display vertical line on all 3 graphs at same point - NOT WORKING
alldots1
.filter((d,i) => +i === +thespot)
.append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
.style("stroke-width", 2)
.style("stroke", "red")
.style("fill", "none");
alldots2
.filter((d,i) => +i === +thespot)
.append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
.style("stroke-width", 2)
.style("stroke", "red")
.style("fill", "none");
alldots3
.filter((d,i) => +i === +thespot)
.append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
.style("stroke-width", 2)
.style("stroke", "red")
.style("fill", "none");
});//END lc1.renderlet
dc.renderAll();
dc.redrawAll();
.reddot {
stroke: red !important;
fill: red !important;
fill-opacity: 1 !important;
}
.greendot {
stroke: green;
fill: green;
fill-opacity: 1 !important;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.1/crossfilter.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.3.3/d3.min.js"></script>
<script src="//dc-js.github.io/dc.js/js/dc.js"></script>
<link href="//dc-js.github.io/dc.js/css/dc.css" rel="stylesheet" />
<svg id="line1"></svg>
<svg id="line2"></svg>
<svg id="line3"></svg>
最佳答案
通过使用 dc.js API,它有一个更简单(且可重用)的解决方案:
/* draw vertical lines code */
var line = d3.svg.line().interpolate('linear');
function draw_verticals(chart, points){
// merge
var selection = chart.g()
.select('g.chart-body')
.selectAll('path.horizontal')
.data(points)
// append
selection.enter()
.append('path')
.attr('class', 'horizontal reddot')
.attr('d', function(d) {
var x = chart.x()(d);
return line([
[x, chart.y().range()[0]],
[x, chart.y().range()[1]]
]);
});
// remove
selection.exit().remove();
}
/* ends here */
有了这个,您只需传递图表和要绘制垂直线的点数组,例如
draw_verticals(lc1, [testdate1, testdate2]);
draw_verticals(lc2, [testdate1, testdate2]);
draw_verticals(lc3, [testdate1, testdate2]);
额外的
要与刷子一起使用,您必须
1) 对于每个图表,删除动画之前的行,用
lcX.on('pretransition', function(c){
draw_verticals(c, []);
});
2) 在 leaflet
事件中重绘线条
lcX.on('renderlet', function(c) {
var thespot;
var allDots = c.selectAll('circle.dot');
allDots.filter(function(d, i) { //d==datum (obj), i==index (of datapoint on line)
if (+d.x === testdate1) thespot = i;
});
// fixed `alldots1` to `allDots1`, now the red point renders correctly
allDots.filter((d, i) => i === thespot).classed('reddot', true);
draw_verticals(c, (thespot?[testdate1]:[]));
});
关于javascript - d3.js 按索引在特定点向折线图添加垂直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211743/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!