可缩放d3折线图有消失的数据
zoomable d3 line chart has disappearing data
我正在尝试为使用自定义数据对象构建的历史折线图添加缩放功能。我一直使用http://codepen.io/brantwills/pen/igsoc/作为模板。图表呈现,但当我尝试缩放有两个错误:
错误:路径属性d="
无效值未捕获的TypeError: undefined不是一个函数(在缩放函数的最后一部分的最后一个转换中)
JSFiddle: http://jsfiddle.net/dshamis317/sFp6Q/
下面是我的代码:function renderHistoricalData(data) {
var parseDate = d3.time.format("%Y%m%d").parse;
data.forEach(function(d) { d.date = parseDate(d.date); });
// data.sort(function(a,b) { return a.date - b.date; });
var margin = {top: 20, right: 80, bottom: 30, left: 50},
width = 1200 - margin.left - margin.right,
height = 450 - margin.top - margin.bottom;
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([height, 0]);
var color = d3.scale.category10();
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
var zoom = d3.behavior.zoom()
.x(x)
.y(y)
.scaleExtent([1, 10])
.on("zoom", zoomed);
var line = d3.svg.line()
.interpolate("basis")
// .defined(function(d) { return d.y!=0; })
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.sentiment); });
var svg = d3.select("#historical_chart").append("svg")
.call(zoom)
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
color.domain(d3.keys(data[0]).filter(function(key) { return key !== "date"; }));
var sites = color.domain().map(function(name) {
return {
name: name,
values: data.map(function(d) {
return {date: d.date, sentiment: +d[name]};
})
};
});
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain([
d3.min(sites, function(c) { return d3.min(c.values, function(v) { return v.sentiment; }); }),
d3.max(sites, function(c) { return d3.max(c.values, function(v) { return v.sentiment; }); })
]);
var site = svg.selectAll(".site")
.data(sites)
.enter().append("g")
.attr("class", "site");
site.append("path")
.attr("class", "line")
.attr("d", function(d) { return line(d.values); })
.style("stroke", function(d) { return color(d.name); });
site.append("text")
.attr("transform", function(d) {
var val = d.values[d.values.length-1];
return "translate(" + x(val.date) + "," + y(val.sentiment) + ")";
})
.attr("x", 3)
.attr("dy", ".35em")
.style("text-anchor", "start")
.text(function(d) { return d.name; });
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Sentiment (%)");
function zoomed() {
svg.select(".x.axis").call(xAxis);
svg.select(".y.axis").call(yAxis);
svg.selectAll('path.line').attr('d', line);
sites.selectAll('.site').attr("transform", function(d) {
return "translate(" + x(d.date) + "," + y(d.sentiment) + ")"; }
);
}
}
谢谢!
好吧,让我们来看看。
首先,在zoomed
中,最后一个变换不需要在那里。在原版中,它是用来移动圆圈的,而你没有。
同样重要的是,您在path.line
上的编辑将d
设置为错误的功能。如果你看看你在第一次制作它时设置的d
,它应该是相同的,作为一般的经验法则,所以它应该是function(d) { return line(d.values); }
,而不仅仅是line
。
现在,它消失的真正原因。
您的缩放范围是基于原始域计算的。但是,直到调用scaleExtent
之后才设置域,这意味着您的缩放都基于默认值。它并没有消失,而是被压缩到图的左边。如果你去掉x轴,你会看到所有数据的彩色涂抹在侧面。
把你所有的域计算移到你建立规模的地方,它会很好。
让事情更具体一点:
function renderHistoricalData(data) {
var parseDate = d3.time.format("%Y%m%d").parse;
data.forEach(function(d) { d.date = parseDate(d.date); });
// data.sort(function(a,b) { return a.date - b.date; });
var margin = {top: 20, right: 80, bottom: 30, left: 50},
width = 1200 - margin.left - margin.right,
height = 450 - margin.top - margin.bottom;
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([height, 0]);
var color = d3.scale.category10();
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
color.domain(d3.keys(data[0]).filter(function(key) { return key !== "date"; }));
var sites = color.domain().map(function(name) {
return {
name: name,
values: data.map(function(d) {
return {date: d.date, sentiment: +d[name]};
})
};
});
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain([
d3.min(sites, function(c) { return d3.min(c.values, function(v) { return v.sentiment; }); }),
d3.max(sites, function(c) { return d3.max(c.values, function(v) { return v.sentiment; }); })
]);
var zoom = d3.behavior.zoom()
.x(x)
.y(y)
.scaleExtent([1, 10])
.on("zoom", zoomed);
var line = d3.svg.line()
.interpolate("basis")
// .defined(function(d) { return d.y!=0; })
.x(function(d) { return x(d.date); })
.y(function(d) { return y(d.sentiment); });
var svg = d3.select("#historical_chart").append("svg")
.call(zoom)
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var site = svg.selectAll(".site")
.data(sites)
.enter().append("g")
.attr("class", "site");
site.append("path")
.attr("class", "line")
.attr("d", function(d) { return line(d.values); })
.style("stroke", function(d) { return color(d.name); });
site.append("text")
.attr("transform", function(d) {
var val = d.values[d.values.length-1];
return "translate(" + x(val.date) + "," + y(val.sentiment) + ")";
})
.attr("x", 3)
.attr("dy", ".35em")
.style("text-anchor", "start")
.text(function(d) { return d.name; });
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Sentiment (%)");
function zoomed() {
svg.select(".x.axis").call(xAxis);
svg.select(".y.axis").call(yAxis);
svg.selectAll('path.line').attr('d', function(d) { return line(d.values); });
}
}
如果你想让文字移动,你可以给它一个容易识别的类,然后在zoomed
中更新它。
给它一个类:
site.append("文本").attr("阶级","lineLabel")
在zoomed
中更新:
svg.selectAll(".lineLabel")
.attr("transform", function(d) {
var val = d.values[d.values.length-1];
return "translate(" + x(val.date) + "," + y(val.sentiment) + ")";
});
这只会使它跟随行尾,但你可以修改任何你喜欢的属性来获得想要的效果
相关文章:
- d3js:d3.csv及其's的数据消失
- "数据表”;jquery加载后CSS样式消失
- 在本地使用浏览器历史记录时刷新页面后数据消失
- 数据表上的行消失
- 数据在数据表的初始化中消失
- 剑道网格中的数据在排序时消失
- 对列进行分组时,网格数据将消失
- 当我回来时,Ajax数据消失了
- 图例中的AmStockChart值在选择与原始数据集不同的数据集后消失
- Angular JS,工厂返回数据,但在控制器中它消失了
- Ember.js(烬数据):为什么兄弟姐妹关系消失了?
- (Highcharts)如何使数据标签消失,如果有,更高的列
- 当使用AJAX和mod_rewrite时,报头和POST数据消失
- 可缩放d3折线图有消失的数据
- Node.js流和数据消失
- 从两个输入文本字段,当我在一个输入数据,如果在下一个输入的东西,它必须消失
- 添加的数据消失
- 使用AngularJS保存JSON数据到服务器-在页面刷新时消失
- Angular Cordova推送数据在加载后就消失了
- jQuery DataTable数据在排序后消失