用角度绘制带有 d3 折线图中实际值的趋势线
Plotting trend line with actual values in d3 line chart with angular
我正在尝试使用角度和 D3 绘制实际值以及趋势线。我读了很多教程,但无法理解我们如何在 d3 中访问控制器的多个变量。
我在控制器中有以下数据:
$scope.salesData=[
{hour: 1997,sales: 205000},
{hour: 1998,sales: 305000},
{hour: 1999,sales: 405000},
];
$scope.lrResults = {slope: -16958.279411764706, intercept: 34325954.51470588, r2: 0.8292316961223657}
.HTML:
<div linear-chart chart-data="salesData" line-data="lrResults"></div>
然后我有以下指令:
app.directive('linearChart', function($parse, $window){
return{
restrict:'EA',
template:"<svg width='850' height='250'></svg>",
link: function(scope, elem, attrs){
var exp = $parse(attrs.chartData);
var salesDataToPlot=exp(scope);
var padding = 20;
var pathClass="path";
var xScale, yScale, xAxisGen, yAxisGen, lineFun, trendline;
var d3 = $window.d3;
var rawSvg=elem.find('svg');
var svg = d3.select(rawSvg[0]);
scope.$watchCollection(exp, function(newVal, oldVal){
salesDataToPlot=newVal;
redrawLineChart();
});
使用上面,我能够解析包含在salesData
中的数据,并使用以下 d3 代码绘制折线图:
svg.append("svg:path")
.attr("transform", "translate(70,0)")
.attr({
d: lineFun(salesDataToPlot),
"stroke": "red",
"stroke-width": 2,
"fill": "none",
"class": pathClass
});
但是我无法理解如何检索lrResults
中包含的数据,然后在正常图的顶部添加趋势线。
以下是我用来绘制线条的代码片段:
svg.append("svg:line")
.attr("x1", xScale(0))
.attr("y1", yScale(lrData.intercept))
.attr("x2", xScale(max))
.attr("y2", yScale((max*lrData.slope)+ lrData.intercept))
.style("stroke", "black");
您需要根据这些参数生成数据。
这是我的控制器中的一个工作示例:
angular.module('d3-angular.controllers', [], function() {})
.controller('myCtrl', function($scope) {
// svg parameters
var width = 500, height = 500, margin = 50;
// line parameters (y = mx + b)
$scope.b = 0.3;
$scope.m = 2;
$scope.numPts = 20;
// generate data
var data = new Array($scope.numPts);
for (var idx = 0; idx < $scope.numPts; idx++) {
data[idx] = {
x: idx/$scope.numPts,
y: $scope.m*idx/$scope.numPts + $scope.b + (Math.random()-0.5)
}
}
// build the scales
var xScale = d3.scale.linear().domain([0,1]).range([margin,width-margin]);
var yScale = d3.scale.linear().domain([0,2.5]).range([height-margin,margin]);
// select our svg element, set up some properties
var svg = d3.select("svg");
svg.attr("width",width).attr("height",height);
// add the trendline
var line = svg.selectAll("line").data([{'p1': [0, $scope.b], 'p2': [1, $scope.m+$scope.b]}]);
line.enter().append("line").attr("stroke","red").attr("stroke-width",2)
.attr("x1", function(d) { return xScale(d.p1[0]) })
.attr("y1", function(d) { return yScale(d.p1[1]) })
.attr("x2", function(d) { return xScale(d.p2[0]) })
.attr("y2", function(d) { return yScale(d.p2[1]) })
// join with our data
var points = svg.selectAll("circle").data(data);
// enter (add circles)
points.enter().append("circle")
.attr("cx", function(d) {
return xScale(d.x);
})
.attr("cy", function(d) {
return yScale(d.y);
})
.attr("r", 5);
// add Axes
var xAxis = d3.svg.axis().scale(xScale).orient("bottom").tickValues([0,1]);
svg.append("g").attr("class","axis")
.attr("transform", "translate(0," + (height-margin) + ")")
.call(xAxis);
var yAxis = d3.svg.axis().scale(yScale).orient("left").ticks(5);
svg.append("g").attr("class","axis")
.attr("transform", "translate(" + margin + ",0)")
.call(yAxis);
})
将示波器参数斜率和截距替换为 m 和 b。尝试。。。可能会有所帮助!
相关文章:
- charts js更改折线图轴的字体大小/颜色和背景线
- 具有任意多条线的D3折线图(以及特定的数据格式)
- 高图折线图:点应该是可点击的,点之间的线不是.这可能吗
- 为什么在交互式多系列折线图中使用 brushed() 时只有一条线被扩展
- cs.js - 同时仅显示一条线(在多折线图中)
- D3折线图中的实线和虚线
- 如何设置角度谷歌折线图的样式,使其在同一条线上有两种样式
- 使用角度nvd3js指令绘制一个包含实线和虚线的折线图
- 在折线图中在多条线上绘制点
- 高线图:给折线图添加标志
- 如何链接图表和表格?我的意思是在单击表格的行时,我必须能够突出显示折线图中的线
- D3:当鼠标悬停事件时,多系列折线图的每条线上都有工具提示
- 带空值的折线图:如何保持线连接
- 如何在jqplot柱状图中拥有比数据点更多的列,并在所有列上保持趋势线的连续性?
- 如何在morris折线图中的线点上显示y轴值
- 如何增加折线图的线宽
- 当数据是相同的高图时,如何使绘图线显示在折线图上
- 谷歌折线图上的趋势线
- 用角度绘制带有 d3 折线图中实际值的趋势线
- 为什么我的谷歌折线图不显示线