- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 d3.js 的新手并尝试在一页的 -x- 轴上绘制多个具有时间维度的图表。 当页面中的任何图表缩放时,我想对所有图表应用相同的缩放。我怎样才能做到这一点?您可以在这里找到一个工作示例:Multiple Charts example ,我需要在缩放事件函数中做哪些改变?
var zoom = d3.behavior.zoom()
.scaleExtent([1, 20])
.x(x)
.on('zoom', function zoomHandler() {
axes.select('.x-axis')
.call(xAxis);
circles.attr("transform", function (d) {
return "translate(" + x(d.date) + "," + y(d.measurement) + ")";
});
svg.selectAll('path.line')
.attr('d', function (d) {
return line(d.values);
});
});
最佳答案
我找到了发布的 jsfiddle 的解决方案。我在图表函数之外定义了缩放行为,并将 svg、圆、线和轴对象保存在相应的列表全局对象中,以便在图形创建范围之外访问。最后,我创建了一个 setzoom 函数,该函数在创建所有图形后调用,并遍历 svglist 数组,对保存在 svglist、circlelist 和 linelist 中的每个对象应用相同的转换。最终的 JavaScript 代码是:
var timeFormat = d3.time.format('%Y-%m-%d %H:%M:%S');
var customTimeFormat = d3.time.format.multi([
[".%L", function (d) { return d.getMilliseconds(); }],
[":%S", function (d) { return d.getSeconds(); }],
["%H:%M", function (d) { return d.getMinutes(); }],
["%H:%M", function (d) { return d.getHours(); }],
["%d / %m", function (d) { return d.getDay() && d.getDate() != 1; }],
["%d", function (d) { return d.getDate() != 1; }],
["%m - %Y", function (d) { return d.getMonth(); }],
["%Y", function () { return true; }]
]);
var color = d3.scale.category10();
var width = 900,
height = 250,
margin = {
top: 5,
right: 50,
bottom: 20,
left: 80
};
var parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse;
var x = d3.time.scale().range([margin.left, width - margin.right]);
var xAxis = d3.svg.axis()
.scale(x)
.tickFormat(customTimeFormat)
.innerTickSize(0)
.outerTickSize(0)
.orient("bottom");
var zoom = d3.behavior.zoom();
var circleslist=[];
var svglist=[];
var axeslist=[];
var ylist=[];
var linelist=[];
function setzoom()
{
zoom.scaleExtent([1, 20])
.x(x)
.on('zoom', function zoomHandler() {
//alert(svglist.length);
for(var i=0;i<3;i++)
{
axeslist[i].select('.x-axis')
.call(xAxis);
circleslist[i].attr("transform", function (d) {
return "translate(" + x(d.date) + "," + ylist[i](d.measurement) + ")";
});
svglist[i].selectAll('path.line')
.attr('d', function (d) {
return linelist[i](d.values);
});
}
});
}
var chartValuesList1 = [{ Date: "2018-01-29 11:47:09", Measurement: 225 },
{ Date: "2018-01-29 12:47:09", Measurement: 225 },{ Date: "2018-01-29 13:47:13", Measurement: 224 },{ Date: "2018-01-29 14:47:13", Measurement: 225 },{ Date: "2018-01-29 15:47:10", Measurement: 223 },
{ Date: "2018-01-29 16:47:11", Measurement: 223 }];
var Array1 = [{ name: "Plot1", units: "", chartValuesList:chartValuesList1 }];
var chartValuesList2 = [{ Date: "2018-01-29 11:47:09", Measurement: 225 },
{ Date: "2018-01-29 12:47:09", Measurement: 225 },{ Date: "2018-01-29 13:47:13", Measurement: 224 },{ Date: "2018-01-29 14:47:13", Measurement: 200 },{ Date: "2018-01-29 15:47:10", Measurement: 233 },
{ Date: "2018-01-29 16:47:11", Measurement: 240 }];
var Array2 = [{ name: "Plot2", units: "", chartValuesList:chartValuesList2 }];
var chartValuesList3 = [{ Date: "2018-01-29 11:47:09", Measurement: 225 },
{ Date: "2018-01-29 12:47:09", Measurement: 550 },{ Date: "2018-01-29 13:47:13", Measurement: 600 },{ Date: "2018-01-29 14:47:13", Measurement: 400 },{ Date: "2018-01-29 15:47:10", Measurement: 300 },
{ Date: "2018-01-29 16:47:11", Measurement: 600 }];
var Array3 = [{ name: "Plot3", units: "", chartValuesList:chartValuesList3 }];
chart("chart1", Array1, "Values");
chart("chart2", Array2, "Values");
chart("chart3", Array3, "Values");
setzoom();
function chart(chartID, chartData, heading) {
var y = d3.scale.linear().range([height - margin.bottom, margin.top]);
ylist.push(y);
var yAxis = d3.svg.axis()
.scale(y)
.tickFormat(function (d) { return d; })
.innerTickSize(-(width - margin.left - margin.right))
.outerTickSize(0)
.orient("left");
var data = chartData;
var line = d3.svg.line()
.interpolate("linear")
.x(function (d) { return x(d.date); })
.y(function (d) { return y(d.measurement); });
linelist.push(line);
var container = d3.select("#" + chartID);
var svg = container.append("svg")
.attr('width', width)
.attr('height', height);
svglist.push(svg);
var defs = svg.append('defs');
defs.append('clipPath')
.attr('id', 'plot-area-clip-path')
.append('rect')
.attr({
x: margin.left,
y: margin.top,
width: width - margin.right - margin.left,
height: height - margin.top - margin.bottom
});
var backRect = svg.append('rect')
.style('stroke', 'none')
.style('fill', '#FFF')
.style('fill-opacity', 0)
.attr({
x: margin.left,
y: margin.top,
width: width - margin.right - margin.left,
height: height - margin.top - margin.bottom,
'pointer-events': 'all'
});
axes = svg.append('g')
.attr('pointer-events', 'none')
.style('font-size', '11px');
axeslist.push(axes);
var chart = svg.append('g')
.attr('class', 'plot-area')
.attr('pointer-events', 'none')
.attr('clip-path', 'url(#plot-area-clip-path)');
var dates = [];
var measurements = [];
var dateStrings = [];
var units;
var chartLines = data.map(function (chartLine) {
units = chartLine.units;
return {
name: chartLine.name,
units: chartLine.units,
values: chartLine.chartValuesList.map(function (value) {
dateStrings.push(value.Date);
var date = parseDate(value.Date);
var measurement = value.Measurement;
dates.push(date);
measurements.push(measurement);
return {
date: date,
measurement: measurement
};
})
}
});
x.domain(d3.extent(dates));
if (chartID == "charge-chart" || chartID == "genBattVdc-chart") {
var max = d3.max(measurements);
y.domain([0, max + (0.1 * max)]);
}
// else if (chartID == "powerFact_g-chart") {
// y.domain([-1.2, 1.2]);
// }
//energy-chart
else if (chartID == "energy-chart") {
y.domain(d3.extent(measurements));
}
else {
//y.domain(d3.extent(measurements));
y.domain([d3.min(measurements) - 0.01 * d3.min(measurements), 1.01 * d3.max(measurements)]);
}
var xAxisEl = axes.append('g')
.attr('class', 'x-axis')
.attr('transform', 'translate(' + 0 + ',' + (height - margin.bottom) + ')')
.call(xAxis);
var yAxisEl = axes.append('g')
.attr('class', 'y-axis')
.attr('transform', 'translate(' + margin.left + ',' + 0 + ')')
.call(yAxis);
svg.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 20)
.attr("x", -height / 2)
.attr("dy", "1em")
.style("text-anchor", "middle")
.text((units == "") ? "" : "( " + units + " )");
backRect.call(zoom);
yAxisEl.selectAll('line')
.style('stroke', '#BBB')
.style('stroke-width', '1px')
.style('shape-rendering', 'crispEdges');
var chartLine = chart.selectAll(".chartLine")
.data(chartLines)
.enter().append("g")
.attr("class", "chartLine");
var paths = chart.selectAll(".chartLine").append("g")
.attr("class", "plot")
.attr("id",
function (d, i) {
return 'tag' + d.name.replace(/\s+/g, '');
})
.append("path")
.attr("class", "line")
.attr("d", function (d) {
return line(d.values);
})
.style("stroke", function (d, i) {
return color(i);
});
/* Title and Legends */
var chartInfo = container.append('svg')
.attr("class", "title")
.attr("x", width + 65)
.attr("y", 50)
.attr("height", height)
.attr("width", 200);
var title = chartInfo.append('svg')
.attr("class", "title")
.attr('width', 200)
.attr('height', 40)
.attr("x", 10)
.attr("y", 0)
.append('g')
.append("text")
.attr("x", 0)
.attr("y", 30)
.attr("height", 30)
.attr("width", 200)
.attr("text-anchor", "start")
.style("font-size", "16px")
.style("font-weight", "bold")
.style("fill", "rgb(128,128,128)")
.text(heading);
var legends = chartInfo.append('svg')
.attr("class", "legend")
.attr('width', 200)
.attr('height', height - 40)
.attr("x", 10)
.attr("y", 60);
legends.selectAll('g').data(chartLines)
.enter()
.append('g')
.each(function (d, i) {
var g = d3.select(this);
g.append("rect")
.attr("x", 10)
.attr("y", i * 25)
.attr("width", 10)
.attr("height", 10)
.style("fill", color(i));
g.append("text")
.attr("x", 30)
.attr("y", i * 25 + 10)
.attr("height", 30)
.attr("width", 100)
.style("fill", color(i))
.on("click", function () {
(!d.active) ? $(this).attr("opacity", 0.3) : $(this).attr("opacity", 1);
var active = d.active ? false : true,
newOpacity = active ? 0 : 1;
d3.select('#tag' + d.name.replace(/\s+/g, ''))
.transition().duration(100)
.style('opacity', newOpacity);
d.active = active;
})
.text(d.name);
});
/* Dots */
var circles = chart.selectAll(".chartLine").select('.plot').append('g')
.attr("class", "dots")
.selectAll('circle')
.data(function (d) { return d.values; })
.enter().append('circle')
// .attr('cy', function(d){
// return y(d.measurement);
// })
// .attr('cx', function(d){
// return x(d.date);
// })
.attr("transform", function (d) {
return "translate(" + x(d.date) + "," + y(d.measurement) + ")";
})
.attr('r', 1)
.attr('fill', 'black')
.attr('pointer-events', 'all')
.attr('stroke', 'black')
.attr('stroke-width', 1)
.on("mouseover", mouseover)
.on("mousemove", function (d) {
var aa = new Date(d.date);
var h = aa.getHours();
var m = aa.getMinutes();
var s = aa.getSeconds();
var t = h + ":" + m + ":" + s;
console.log(aa, t)
divToolTip.text(this.parentNode.__data__.units + ": " + d.measurement + ", " + "Time: " + t)
.style("left", (d3.event.pageX + 15) + "px")
.style("top", (d3.event.pageY - 10) + "px");
})
.on("mouseout", mouseout);
circleslist.push(circles);
/* Tooltip */
var divToolTip = d3.select("body").append("div")
.attr("class", "tooltip")
.style("opacity", 1e-6);
function mouseover() {
divToolTip.transition()
.duration(100)
.style("opacity", 1);
}
function mouseout() {
divToolTip.transition()
.duration(100)
.style("opacity", 1e-6);
}
}
关于javascript - d3.js 如何同时缩放多个图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49008649/
我在 div 和 jquery ui slider 中有一个图像列表,当用户滑动栏时,图像应该调整大小/缩放(无论你想怎么调用它),我尝试选择所有图像并更改 css 的宽度和使用 jquery 的高度
我正在制作一张具有缩放和平移功能的世界地图。我在某些城市上画了圆圈,圆圈的半径由数据决定。当鼠标悬停在这些圆圈上时,将出现一个工具提示来显示数据。 代码结构为 //在此选择上调用缩放行为 - 让我们调
我正在使用 jquery UI slider (http://jqueryui.com/slider/)。 我需要对整个站点进行缩放。使用 css 样式在 IE+Chrome im 中缩放 - “缩放
我花了很多时间试图找到一种使用 CGAffineScale 将 View 转换为给定点的方法,包括摆弄 anchor 、在转换前后移动 View 的中心以及全面的谷歌搜索。我知道使用 UIScroll
我希望能够用手指旋转和缩放/缩放我的位图,我已经为此寻找了所有示例项目,但它们都与我的代码不匹配。这是我的 onTouchListener 代码。 public class MyView extend
在我的页面中间,我有一个 div 元素,其中包含一些内容(其他 div、图像等)。 before something inside another something
我一直在尝试使用 google maps API V3 的绘图管理器(绘制矩形)。使用 -webkit-transform 缩放谷歌地图 Canvas (包含 div)后像这样 var transf
这个问题在这里已经有了答案: How to resize the iPhone/iPad Simulator? (12 个答案) 关闭 5 年前。 我正在编写 iOS 应用 我使用 Xcode 6.
这几天一直在研究微服务,我想知道人们是如何着手自动化负载平衡和扩展这些东西的? 我心中有一个特定的场景,我想实现什么,但不确定是否可行,或者我的想法有误。就这样吧…… 假设我有一个由 3 台名为 A、
我正在使用 ffmpeg for android 来制作 mp4 格式的视频。我无法让这个命令在 FFMPEG 中工作,基本上我正在尝试添加两个图像,缩放它们,添加缩放效果,最后将结果连接到一个视频文
使用 OpenGL 我正在尝试绘制我校园的原始 map 。 谁能向我解释一下平移、缩放和旋转通常是如何实现的? 例如,通过平移和缩放,这仅仅是我调整我的视口(viewport)吗?所以我绘制并绘制了构
我需要在 iphone sdk 界面生成器中将按钮旋转 30 度,该怎么做? 最佳答案 您无法在 Interface Builder 中执行此操作,但代码非常简单。 确保您已将 IB 中的按钮连接到
假设默认级别等于“1”,是否可以检测触摸设备的捏合(缩放)级别?原因是我希望根据捏合级别禁用页面元素(显示:无)。 如果可以将其放在一个设置缩放级别值的函数中,那就太好了,例如: var ZOOM =
我正在努力找出并确定如何根据这个例子放大我的鼠标位置。 (https://stackblitz.com/edit/js-fxnmkm?file=index.js) let node, scal
我已将 UIWebView 的“scalesPageToFit”属性设置为 YES。 它正在缩放,但是当页面加载时,内容的字体很小,不捏就无法阅读。我们可以将缩放比例设置为默认值吗? 最佳答案 这更多
我仍在学习 jQuery mobile 的技巧,并且在 data-role="page"上放大和缩小图片/图像时遇到问题。有没有办法使用 jquery mobile 在 iPhone 上的图像上进行捏
给定一组 n 个维度为 d 的向量,存储在 (n,d) 数组中,以及第二组 m 相同维度的向量(存储在 (m,d) 数组中)我想计算向量之间的平方点距离,由大小为 的某个矩阵 A 缩放>(d,d)。
我想知道是否有人可以指出我正确的方向。 我使用 CSS3 过渡创建了缩放效果。将鼠标悬停在该对象上,它会转换为更大的版本。这看起来很棒并且效果很棒,但问题是这种效果在 IE 中不起作用,所以我需要在
mapbox-gl-js 版本:0.38.0在 ionic 2.2.11 上通过 npm repo 使用 正如您在这张 gif 上看到的 https://giphy.com/gifs/ionic-an
所以我花了几个小时在网上搜索帮助,但所有论坛和文档都没有向我正确解释我应该采取的最佳方式。 目前我有一个具有 XML 相对布局的 Activity (背景设置为 map 图片),我想实现多手势缩放功能
我是一名优秀的程序员,十分优秀!