javascript - 在 d3.js 中的范围的平均值(或中值)处绘制网格线

标签 javascript d3.js

我可以使用如下方式在图表中数据的中心点绘制网格线:

startX = d3.min(x.domain()),
endX = d3.max(x.domain()),
startY = d3.min(y.domain()),
endY = d3.max(y.domain());
lines = [{x1: startX, x2: endX, y1: (startY + endY)/2, y2: (startY + endY)/2},
            {x1: (startX + endX)/2, x2: (startX + endX)/2, y1: startY, y2: endY}]

然后渲染线条。

但是,我想要的是数据范围的平均值(和/或中位数,具体取决于情况)处的线。我尝试了这个,但该行与上面的代码产生的位置相同。下面是我的完整代码,我试图在 x 和 y 数据范围的平均值处绘制线条。我认为问题在于我如何定义变量 x 和 y,但我不确定如何调整它们。所发生的情况是,两条线都在 44 处绘制(x 轴垂直方向为 44,水平方向 y 轴为 44)。但是,数据集的平均值并不都是 44。这是水平线的正确值,但不是垂直线的正确值。

编辑:发现问题是我得到的平均值是轴线上值的平均值,这与我的数据集的平均值不同。但不确定如何对此进行调整。

var margin = {t:30, r:20, b:20, l:40 },
w = 1000 - margin.l - margin.r,
h = 600 - margin.t - margin.b,
x = d3.scale.linear()
.range([0, w])

y = d3.scale.linear()
.range([h - 60, 0])

color = d3.scale.category10();

 var svg = d3.select("#chart").append("svg")
.attr("width", w + margin.l + margin.r)
.attr("height", h + margin.t + margin.b);
 fig = svg.append("g").attr("transform", "translate(40, 20)");


 var xAxis = d3.svg.axis()
.scale(x)
.ticks(20)
.tickSubdivide(true)
.tickSize(6, 3, 0)

.orient("bottom");


 var yAxis = d3.svg.axis()
.scale(y)
.ticks(20)
.tickSubdivide(true)
.tickSize(6, 3, 0)
.orient("left");

 ymean = d3.mean(y.domain()); 
 xmean = d3.mean(x.domain()); 
 lines = [{x1: startX, x2: endX, y1: ymean, y2: ymean},//horizontal
        {x1: xmean, x2:xmean, y1: startY, y2: endY}] //vertical

fig.selectAll(".grid-line")
.data(lines).enter()
.append("line")
.attr("x1", function(d){ return x(d.x1); })
.attr("x2", function(d){ return x(d.x2); })
.attr("y1", function(d){ return y(d.y1); })
.attr("y2", function(d){ return y(d.y2); })
.style("stroke", "#000")

任何建议都会有帮助。谢谢。

编辑:正如建议的,我现在有一个不同的评估员,但线条根本没有画出来。这是更新后的代码:

 ymean = d3.mean(data, function(d) { return d.incidence; }); 
  xmean = d3.mean(data, function(d) { return d.variance; }); 


        lines = [{x1: startX, x2: endX, y1: ymean, y2: ymean},
                 {x1: xmean, x2:xmean, y1: startY, y2: endY}]

fig.selectAll(".grid-line")
.data(lines).enter()
.append("line")
.attr("x1", function(d){ return x(d.x1); })
.attr("x2", function(d){ return x(d.x2); })
.attr("y1", function(d){ return y(d.y1); })
.attr("y2", function(d){ return y(d.y2); })
.style("stroke", "#000")

这没有错误,但线条根本不画。如果我替换lines变量中的值,如下所示,会得到相同的结果。

lines = [{x1: startX, x2: endX, y1: 50, y2: 50},
{x1: xmean, x2:xmean, y1: startY, y2: endY}]

这向我表明这件作品有问题,但我不知道它是什么。

最佳答案

您需要根据您的数据而不是规模来计算平均值和中位数:

ymean = d3.mean(inputData, function(d) { return d.xVal; }); 
xmean = d3.mean(inputData, function(d) { return d.yVal; }); 

这些是通用访问器函数,如果您需要有关访问器函数的具体指导(function(d) { return d.xVal; } 部分),您需要提供以下格式您的输入数据集

关于javascript - 在 d3.js 中的范围的平均值(或中值)处绘制网格线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27084532/

相关文章:

javascript - Jquery 循环和 Ajax 字幕

javascript - 导航栏下方的搜索文本框

javascript - d3js Nice() 未对轴域进行舍入

javascript - 视觉 : CSS does not apply to D3's svg when using scoped

javascript - 尝试使用 highcharts.js 在分组箱形图上覆盖散点图

javascript - 调用服务器时找不到 socket.io

javascript - 检测用户在网页上的位置

svg - 在 d3.js 地理 map 中如何在每个国家/地区创建一个圆圈?

javascript - d3 版本 4 中的 d3.layout.treemap

jquery - 我使用 D3 树 js 创建了树。重点是我需要每个树节点的顶部和左侧的值。如何获取树节点的顶部和左侧值?