javascript - 连接直方图顶部的简单折线图

标签 javascript d3.js charts linechart

在下面的示例中,我将直方图映射到字母与频率。现在,我想要一个相同数据的折线图,而不需要做太多改变。这意味着只有一条红线连接直方图的顶部。有人可以帮我吗?

<html>

<head> 

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.3.0/d3.min.js"></script> 

</head>

<body> 

<svg width="960" height="500"></svg>

<script>

//Our basic data 
var data = [
    {frequency:0.08, letter:"A"},
    {frequency:0.11,letter:"B"},
    {frequency:0.13,letter:"C"}
];

var svg = d3.select("svg");
var margin = {top: 40, bottom: 40, left: 40, right: 40};
var width = svg.attr("width") - margin.left - margin.right;
var height = svg.attr("height") - margin.top - margin.bottom;

var x = d3.scaleBand().rangeRound([0, width]).padding(0.6);
var y = d3.scaleLinear().rangeRound([height, 0]);

//defining our main g in svg 
var g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");

//Looping for data bars 
data.forEach(function(){

    x.domain(data.map(function(d) { return d.letter; }));
    y.domain([0, d3.max(data, function(d) { return d.frequency; })]);

    g
        .append("g")
        .attr("transform", "translate(0," + height + ")")
        .call(d3.axisBottom(x));

    g
        .append("g")
        .call(d3.axisLeft(y).ticks(10, "%"));

    g
        .selectAll(".bar")
        .data(data)
        .enter()
        .append("rect")
        .attr("x", function(d) { return x(d.letter); })
        .attr("y", function(d) { return y(d.frequency); })
        .attr("width", x.bandwidth())
        .attr("height", function(d) { return height - y(d.frequency); });

});

</script> 

</body> 

</html> 

直方图:

enter image description here

最佳答案

首先,摆脱 data.forEach:为什么你想将所有内容绘制 3 次?

之后,定义您的线生成器:

var line = d3.line()
    .x(function(d){ return x(d.letter) + x.bandwidth()/2})
    .y(function(d){ return y(d.frequency)})
    .curve(d3.curveCardinal);;

这里,x.bandwidth()/2 会将线放置在每个条形顶部的中间。我正在使用 d3.curveCardinal,但你有 other options为曲线。

然后,附加行:

g.append("path")
    .datum(data)
    .attr("d", line);

这是演示:

<head> 

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.3.0/d3.min.js"></script> 

</head>

<body> 

<svg width="960" height="500"></svg>

<script>

//Our basic data 
var data = [
    {frequency:0.08, letter:"A"},
    {frequency:0.11,letter:"B"},
    {frequency:0.13,letter:"C"}
];

var svg = d3.select("svg");
var margin = {top: 40, bottom: 40, left: 40, right: 40};
var width = svg.attr("width") - margin.left - margin.right;
var height = svg.attr("height") - margin.top - margin.bottom;

var x = d3.scaleBand().rangeRound([0, width]).padding(0.6);
var y = d3.scaleLinear().rangeRound([height, 0]);

//defining our main g in svg 
var g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");

//Looping for data bars 


    x.domain(data.map(function(d) { return d.letter; }));
    y.domain([0, d3.max(data, function(d) { return d.frequency; })]);
		
		var line = d3.line()
			.x(function(d){ return x(d.letter) + x.bandwidth()/2})
			.y(function(d){ return y(d.frequency)})
        .curve(d3.curveCardinal);

    g
        .append("g")
        .attr("transform", "translate(0," + height + ")")
        .call(d3.axisBottom(x));

    g
        .append("g")
        .call(d3.axisLeft(y).ticks(10, "%"));

    g
        .selectAll(".bar")
        .data(data)
        .enter()
        .append("rect")
        .attr("x", function(d) { return x(d.letter); })
        .attr("y", function(d) { return y(d.frequency); })
        .attr("width", x.bandwidth())
        .attr("height", function(d) { return height - y(d.frequency); });
				
				g.append("path")
				.datum(data)
				.attr("d", line)
				.attr("stroke", "red")
				.attr("fill", "none");


</script>

关于javascript - 连接直方图顶部的简单折线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40401653/

相关文章:

javascript - 如何为 DOJO 中的特定 url 模拟 dojo.data.ItemFileReadStore?

javascript - 如何将按钮变成下拉菜单?

javascript - 正则表达式模式搜索以 2 个字母或 2 个数字开头

javascript - 突出显示子节点的 TreeMap D3

javascript - 在 Chart.js 中向圆环图添加标签会显示每个图表中的所有值

javascript - 图表或表格可以以不同的格式导出吗?

javascript - Django : provide dynamically generated data as attachment on button press

javascript - 如何将标记头放在链接的中间

javascript - 如何将动态选择的图像覆盖在动态填充的 div 上

javascript - Google Charts 如何隐藏值 = 0