使用 r2d3 在 d3.js 中使用 R data.frame 对象

ssp*_*c3r 5 r d3.js r2d3

我试图了解如何使用包将 R 数据框传递给 d3.js 脚本r2d3。扩展r2d3条形图示例以访问data.frame对象中的变量会有所帮助。

代码:

library(r2d3)
data <- data.frame(nums = c(0.3, 0.6, 0.8, 0.95, 0.40, 0.20))
r2d3(data, script = "test.js")
Run Code Online (Sandbox Code Playgroud)

js代码:

var barHeight = Math.floor(height / data.length);

svg.selectAll('rect')
  .data(data.nums)
  .enter().append('rect')
    .attr('width', function(d) { return d * width; })
    .attr('height', barHeight)
    .attr('y', function(d, i) { return i * barHeight; })
    .attr('fill', 'steelblue');
Run Code Online (Sandbox Code Playgroud)

错误:

Error: svg.selectAll(...).data(...).enter is not a function in (test.js#5:4)
TypeError: svg.selectAll(...).data(...).enter is not a function
Run Code Online (Sandbox Code Playgroud)

And*_*eid 6

发生此错误是因为data.nums未定义。

您的data变量不是包含数组的对象,如下所示:

var data = {
      nums: [0.3,0.6,0.8,0.95,0.40,0.20]
    }
Run Code Online (Sandbox Code Playgroud)

但是,而是一个包含对象的数组:

var data = [
  {nums:0.3},
  {nums:0.6},
  {nums:0.8},
  {nums:0.95},
  {nums:0.40},
  {nums:0.2}
]
Run Code Online (Sandbox Code Playgroud)

为了保持您的r代码,我们只需要将数据数组本身传递给selection.data()并访问nums每个数据的属性:

var barHeight = Math.floor(height / data.length);

svg.selectAll('rect')
  .data(data)
  .enter().append('rect')
    .attr('width', function(d) { return d.nums * width; })
    .attr('height', barHeight)
    .attr('y', function(d, i) { return i * barHeight; })
    .attr('fill', 'steelblue');
Run Code Online (Sandbox Code Playgroud)