如何使用Json Daives的D3词云创建圆形词云

Ven*_*enu 7 javascript r word-cloud d3.js shiny

我在R中使用Json Daives的D3词云.我已经生成了云词,但我面临的问题是词云的形状不是圆形的.我正在通过d3.layout.cloud.js文件尝试修改代码来实现这一目标但是徒劳无功.该文件有一个名为" place " 的函数,它定义了云的形状.但我无法弄清楚如何修改此功能以实现圆形.有没有其他人试图实现这种循环表示?我粘贴下面的place函数的代码.

function place(board, tag, bounds) {
  var perimeter = [{x: 0, y: 0}, {x: size[0], y: size[1]}],
      startX = tag.x,
      startY = tag.y,
      maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]),
      s = spiral(size),
      dt = Math.random() < .5 ? 1 : -1,
      t = -dt,
      dxdy,
      dx,
      dy;

  while (dxdy = s(t += dt)) {
    dx = ~~dxdy[0];
    dy = ~~dxdy[1];

    if (Math.min(dx, dy) > maxDelta) break;

    tag.x = startX + dx;
    tag.y = startY + dy;

    if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 ||
        tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue;
    // TODO only check for collisions within current bounds.
    if (!bounds || !cloudCollide(tag, board, size[0])) {
      if (!bounds || collideRects(tag, bounds)) {
        var sprite = tag.sprite,
            w = tag.width >> 5,
            sw = size[0] >> 5,
            lx = tag.x - (w << 4),
            sx = lx & 0x7f,
            msx = 32 - sx,
            h = tag.y1 - tag.y0,
            x = (tag.y + tag.y0) * sw + (lx >> 5),
            last;
        for (var j = 0; j < h; j++) {
          last = 0;
          for (var i = 0; i <= w; i++) {
            board[x + i] |= (last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0);
          }
          x += sw;
        }
        delete tag.sprite;
        return true;
      }
    }
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)