Javascript D3-多折线图,未显示第二个折线圈
我正在做一个对比折线图,根据字母绘制频率和频率2。另外,我希望在两条线的节点上都画圆。然而,我在第一组线节点中得到了圆。我在第二线没有画圆圈 如果我对第一组圆代码进行注释,那么我可以在第二行看到红色的圆 请帮忙,这样我就可以看到第二行的红色圆圈,以及第一行的红色圆圈 片段:Javascript D3-多折线图,未显示第二个折线圈,javascript,d3.js,svg,charts,linechart,Javascript,D3.js,Svg,Charts,Linechart,我正在做一个对比折线图,根据字母绘制频率和频率2。另外,我希望在两条线的节点上都画圆。然而,我在第一组线节点中得到了圆。我在第二线没有画圆圈 如果我对第一组圆代码进行注释,那么我可以在第二行看到红色的圆 请帮忙,这样我就可以看到第二行的红色圆圈,以及第一行的红色圆圈 片段: <html> <head> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.12/an
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.12/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.3.0/d3.min.js"></script>
</head>
<body ng-app="myApp" ng-controller="myCtrl">
<svg></svg>
<script>
//module declaration
var app = angular.module('myApp',[]);
//Controller declaration
app.controller('myCtrl',function($scope){
$scope.svgWidth = 800;//svg Width
$scope.svgHeight = 500;//svg Height
//Data in proper format
var data = [
{"letter": "A","frequency": "5.01", "frequency2":"18.03"},
{"letter": "B","frequency": "7.80", "frequency2":"15.03"},
{"letter": "C","frequency": "15.35","frequency2":"27.03"},
{"letter": "D","frequency": "22.70","frequency2":"12.03"},
{"letter": "E","frequency": "34.25", "frequency2":"21.03"},
{"letter": "F","frequency": "10.21","frequency2":"28.03"},
{"letter": "G","frequency": "7.68","frequency2":"09.03"},
];
//removing prior svg elements ie clean up svg
d3.select('svg').selectAll("*").remove();
//resetting svg height and width in current svg
d3.select("svg").attr("width", $scope.svgWidth).attr("height", $scope.svgHeight);
//Setting up of our svg with proper calculations
var svg = d3.select("svg");
var margin = {top: 20, right: 20, bottom: 30, left: 40};
var width = svg.attr("width") - margin.left - margin.right;
var height = svg.attr("height") - margin.top - margin.bottom;
//Plotting our base area in svg in which chart will be shown
var g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
//X and Y scaling
var x = d3.scaleBand().rangeRound([0, width]).padding(0.4);
var y = d3.scaleLinear().rangeRound([height, 0]);
x.domain(data.map(function(d) { return d.letter; }));
y.domain([0, d3.max(data, function(d) { return +d.frequency; })]);
//Final Plotting
//for x axis
g.append("g")
.call(d3.axisBottom(x))
.attr("transform", "translate(0," + height + ")");
//for y axis
g.append("g")
.call(d3.axisLeft(y))
.append("text").attr("transform", "rotate(-90)").attr("text-anchor", "end");
/**************** First Path ******************/
//the line function for path
var lineFunction = d3.line()
.x(function(d) {return x(d.letter); })
.y(function(d) { return y(d.frequency); })
.curve(d3.curveLinear);
//defining the lines
var path = g.append("path");
//plotting lines
path
.attr("d", lineFunction(data))
.attr("stroke", "blue")
.attr("stroke-width", 2)
.attr("fill", "none")
.append("circle");
g.selectAll('circle')
.data(data)
.enter().append('circle')
.attr('cx', function(d) {
return x(d.letter);
})
.attr('cy', function(d) {
return y(d.frequency);
})
.attr('r', 6)
.style("fill", "blue");
/**************** Second Path *********************/
//the line function for path
var lineFunction = d3.line()
.x(function(d) {return x(d.letter); })
.y(function(d) { return y(d.frequency2); })
.curve(d3.curveLinear);
//defining the lines
var path = g.append("path");
//plotting lines
path
.attr("d", lineFunction(data))
.attr("stroke", "red")
.attr("stroke-width", 2)
.attr("fill", "none")
.append("circle");
g.selectAll('circle')
.data(data)
.enter().append('circle')
.attr('cx', function(d) {
return x(d.letter);
})
.attr('cy', function(d) {
return y(d.frequency2);
})
.attr('r', 6)
.style("fill", "red");
});
</script>
</body>
</html>
//模块声明
var-app=angular.module('myApp',[]);
//控制器声明
应用程序控制器('myCtrl',函数($scope){
$scope.svgWidth=800;//svg宽度
$scope.svgHeight=500;//svg高度
//正确格式的数据
风险值数据=[
{“字母”:“A”,“频率”:“5.01”,“频率2”:“18.03”},
{“字母”:“B”,“频率”:“7.80”,“频率2”:“15.03”},
{“字母”:“C”,“频率”:“15.35”,“频率2”:“27.03”},
{“字母”:“D”,“频率”:“22.70”,“频率2”:“12.03”},
{“字母”:“E”,“频率”:“34.25”,“频率2”:“21.03”},
{“字母”:“F”,“频率”:“10.21”,“频率2”:“28.03”},
{“字母”:“G”,“频率”:“7.68”,“频率2”:“09.03”},
];
//删除以前的svg元素,即清理svg
d3.select('svg')。selectAll(“*”).remove();
//在当前svg中重置svg高度和宽度
d3.选择(“svg”).attr(“宽度”、$scope.svgWidth).attr(“高度”、$scope.svgHeight);
//通过正确的计算设置svg
var svg=d3.选择(“svg”);
var-margin={顶部:20,右侧:20,底部:30,左侧:40};
var width=svg.attr(“width”)-margin.left-margin.right;
var height=svg.attr(“height”)-margin.top-margin.bottom;
//在svg中绘制我们的基本区域,其中将显示图表
var g=svg.append(“g”).attr(“transform”、“translate”(“+margin.left+”,“+margin.top+”));
//X和Y缩放
var x=d3.scaleBand().rangeRound([0,宽度]).padding(0.4);
变量y=d3.scaleLinear().rangeRound([height,0]);
x、 域(data.map(函数(d){返回d.letter;}));
y、 域([0,d3.max(数据,函数(d){return+d.frequency;})]);
//最终绘图
//对于x轴
g、 附加(“g”)
.call(d3.axisBottom(x))
.attr(“变换”、“平移(0)”、“高度+”);
//对于y轴
g、 附加(“g”)
.呼叫(d3.左(y))
.append(“text”).attr(“变换”、“旋转(-90)”).attr(“文本锚定”、“结束”);
/****************第一条路径******************/
//路径的线函数
var lineFunction=d3.line()
.x(函数(d){返回x(d字母);})
.y(函数(d){返回y(d.频率);})
.曲线(d3.曲线线);
//界定界线
var path=g.append(“路径”);
//绘制线
路径
.attr(“d”,线函数(数据))
.attr(“笔划”、“蓝色”)
.attr(“笔划宽度”,2)
.attr(“填充”、“无”)
.附加(“圆圈”);
g、 选择全部('圆圈')
.数据(数据)
.enter().append('圆')
.attr('cx',函数(d){
返回x(d.letter);
})
.attr('cy',函数(d){
返回y(d.频率);
})
.attr('r',6)
.样式(“填充”、“蓝色”);
/****************第二条道路*********************/
//路径的线函数
var lineFunction=d3.line()
.x(函数(d){返回x(d字母);})
.y(函数(d){返回y(d.frequency2);})
.曲线(d3.曲线线);
//界定界线
var path=g.append(“路径”);
//绘制线
路径
.attr(“d”,线函数(数据))
.attr(“笔划”、“红色”)
.attr(“笔划宽度”,2)
.attr(“填充”、“无”)
.附加(“圆圈”);
g、 选择全部('圆圈')
.数据(数据)
.enter().append('圆')
.attr('cx',函数(d){
返回x(d.letter);
})
.attr('cy',函数(d){
返回y(d.频率2);
})
.attr('r',6)
.样式(“填充”、“红色”);
});
结果:
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.12/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.3.0/d3.min.js"></script>
</head>
<body ng-app="myApp" ng-controller="myCtrl">
<svg></svg>
<script>
//module declaration
var app = angular.module('myApp',[]);
//Controller declaration
app.controller('myCtrl',function($scope){
$scope.svgWidth = 800;//svg Width
$scope.svgHeight = 500;//svg Height
//Data in proper format
var data = [
{"letter": "A","frequency": "5.01", "frequency2":"18.03"},
{"letter": "B","frequency": "7.80", "frequency2":"15.03"},
{"letter": "C","frequency": "15.35","frequency2":"27.03"},
{"letter": "D","frequency": "22.70","frequency2":"12.03"},
{"letter": "E","frequency": "34.25", "frequency2":"21.03"},
{"letter": "F","frequency": "10.21","frequency2":"28.03"},
{"letter": "G","frequency": "7.68","frequency2":"09.03"},
];
//removing prior svg elements ie clean up svg
d3.select('svg').selectAll("*").remove();
//resetting svg height and width in current svg
d3.select("svg").attr("width", $scope.svgWidth).attr("height", $scope.svgHeight);
//Setting up of our svg with proper calculations
var svg = d3.select("svg");
var margin = {top: 20, right: 20, bottom: 30, left: 40};
var width = svg.attr("width") - margin.left - margin.right;
var height = svg.attr("height") - margin.top - margin.bottom;
//Plotting our base area in svg in which chart will be shown
var g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
//X and Y scaling
var x = d3.scaleBand().rangeRound([0, width]).padding(0.4);
var y = d3.scaleLinear().rangeRound([height, 0]);
x.domain(data.map(function(d) { return d.letter; }));
y.domain([0, d3.max(data, function(d) { return +d.frequency; })]);
//Final Plotting
//for x axis
g.append("g")
.call(d3.axisBottom(x))
.attr("transform", "translate(0," + height + ")");
//for y axis
g.append("g")
.call(d3.axisLeft(y))
.append("text").attr("transform", "rotate(-90)").attr("text-anchor", "end");
/**************** First Path ******************/
//the line function for path
var lineFunction = d3.line()
.x(function(d) {return x(d.letter); })
.y(function(d) { return y(d.frequency); })
.curve(d3.curveLinear);
//defining the lines
var path = g.append("path");
//plotting lines
path
.attr("d", lineFunction(data))
.attr("stroke", "blue")
.attr("stroke-width", 2)
.attr("fill", "none")
.append("circle");
g.selectAll('circle')
.data(data)
.enter().append('circle')
.attr('cx', function(d) {
return x(d.letter);
})
.attr('cy', function(d) {
return y(d.frequency);
})
.attr('r', 6)
.style("fill", "blue");
/**************** Second Path *********************/
//the line function for path
var lineFunction = d3.line()
.x(function(d) {return x(d.letter); })
.y(function(d) { return y(d.frequency2); })
.curve(d3.curveLinear);
//defining the lines
var path = g.append("path");
//plotting lines
path
.attr("d", lineFunction(data))
.attr("stroke", "red")
.attr("stroke-width", 2)
.attr("fill", "none")
.append("circle");
g.selectAll('circle')
.data(data)
.enter().append('circle')
.attr('cx', function(d) {
return x(d.letter);
})
.attr('cy', function(d) {
return y(d.frequency2);
})
.attr('r', 6)
.style("fill", "red");
});
</script>
</body>
</html>
我想我在某处犯了一些愚蠢的错误。Pl帮助。这里有两个问题: 首先,对两组圆执行此操作时:
g.selectAll('circle')
您的第二个组正在选择现有图元,第二个组的“回车”选项将为空
尝试为每个组使用不同的选择器,如下所示:
//for the first group
g.selectAll('.circles1')
//for the second group
g.selectAll('.circles2')
第二个问题是,对于第二组圆,应该使用frequency2
:
.attr('cy', function(d) {
return y(d.frequency2);
})
这是一个工作演示:
var数据=[
{“字母”:“A”,“频率”:“5.01”,“频率2”:“18.03”},
{“字母”:“B”,“频率”:“7.80”,“频率2”:“15.03”},
{“字母”:“C”,“频率”:“15.35”,“频率2”:“27.03”},
{“信”