创建中心带有最大泡沫的泡泡图

时间:2015-04-29 16:44:34

标签: r bubble-chart

我正在尝试使用一组数据创建气泡图,如下所示:

X --> 10
Y --> 20
Z --> 5
Q --> 10

我只需要将最大的气泡(基于其数量)放在中心(给予或接受),其余气泡围绕它而不重叠。

我见过的所有R示例都需要一个二维数据集,由于我拥有的数据只有一维,我想知道是否可以在R中创建这样的图。

如果有人可以向我推荐一些有用的提示,那将会很棒。顺便说一下,我需要使用SA tools,因此d3js之类的选项不可用。但是,我愿意使用R以外的工具。

我不太确定是否应该在Stack OverflowCross Validated中询问此问题,因此如果版主认为它不属于此处,我会将其删除。

1 个答案:

答案 0 :(得分:2)

这应该这样做,主要的想法是你按照半径的值排序,所以第一个是最大的,然后移动它周围的值(一边是奇数,甚至是另一边的),所以值是减少双向。

代码中的进一步说明。

library(plotrix)
library(RColorBrewer)

# Set the random seed, to get reproducible results
set.seed(54321)

# Generate some random values for the radius
num.circles <- 11
rd <- runif(num.circles, 1, 20)

df <- data.frame(labels=paste("Lbl", 1:num.circles), radius=rd)

# Sort by descending radius. The biggest circle is always row 1
df <- df[rev(order(df$radius)),]

# Now we want to put the biggest circle in the middle and the others on either side
# To do so we reorder the data frame taking the even values first reversed, then the odd values.
# This ensure the biggest circle is in the middle

df <- df[c(rev(seq(2, num.circles, 2)), seq(1, num.circles, 2)),]

# Space between the circles. 0.2 * average radius seems OK
space.between <- 0.2 * mean(df$radius)

# Creat an empty plot
plot(0, 0, "n", axes=FALSE, bty="n", xlab="", ylab="", 
     xlim=c(0, sum(df$radius)*2+space.between*num.circles),
     ylim=c(0, 2.5 * max(df$radius)))

# Draw the circle at half the height of the biggest circle (plus some padding)
xx <- 0
mid.y <- max(df$radius) * 1.25

# Some nice degrading tones of blue
colors <- colorRampPalette(brewer.pal(8,"Blues"))(num.circles/2)

for (i in 1:nrow(df))
  {
  row <- df[i,]
  x <- xx + row$radius + i*space.between
  y <- mid.y

  # Draw the circle
  draw.circle(x, y, row$radius, 
              col=colors[abs(num.circles/2-i)])
  # Add the label
  text(x, y, row$labels, cex=0.6)

  # Update current x position
  xx <- xx + row$radius * 2
  }

结果:circles

Live version on RFiddle