gpt4 book ai didi

javascript - 可缩放的 d3 折线图有消失的数据

转载 作者:行者123 更新时间:2023-11-30 17:21:44 24 4
gpt4 key购买 nike

我正在尝试为使用自定义数据对象构建的历史折线图添加缩放功能。我一直在使用 http://codepen.io/brantwills/pen/igsoc/作为模板。图表已呈现,但当我尝试缩放时出现两个错误:

错误:路径属性 d=""的值无效
Uncaught TypeError: undefined is not a function(在最后一个转换中,翻译缩放函数的最后一部分)

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线(d.值); },不仅仅是

现在,由于实际原因,它正在消失。

您的比例范围是根据原始域计算的。但是,在调用 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) + ")";
});

这只会让它跟随行尾,但您可以修改任何您喜欢的属性以获得想要的效果。

关于javascript - 可缩放的 d3 折线图有消失的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25041079/

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