我正在尝试使用一组数据创建气泡图,如下所示:
X --> 10
Y --> 20
Z --> 5
Q --> 10
我只需要将最大的气泡(基于其数量)放在中心(给予或接受),其余气泡围绕它而不重叠。
我见过的所有R示例都需要一个二维数据集,由于我拥有的数据只有一维,我想知道是否可以在R中创建这样的图。
如果有人可以向我推荐一些有用的提示,那将会很棒。顺便说一下,我需要使用SA tools
,因此d3js
之类的选项不可用。但是,我愿意使用R以外的工具。
我不太确定是否应该在Stack Overflow或Cross Validated中询问此问题,因此如果版主认为它不属于此处,我会将其删除。
答案 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
}
结果: