堆积气泡图,"bottom aligned"

Stacked bubble chart, "bottom aligned"

初次接触编程post。

我正在尝试创建一个堆积气泡图来显示人口如何分解成它的比例。我的目标是将其编写为一个函数,以便我可以轻松地重复使用它,但我需要在将其转换为函数之前对代码的内容进行排序。

这是我想要的情节类型:

这是我目前试过的代码:

library(ggplot2)

# some data
observations = c(850, 500, 200, 50)
plot_data = data.frame(
                    "x"         = rep.int(1,length(observations))
                   ,"y"         = rep.int(1,length(observations))
                   , "size"     = rep.int(1,length(observations))
                   ,"colour"    = c(1:length(observations)) 
                   )

# convert to percentage for relative sizes
for (i in 1:length(observations)) 
                {
                plot_data$size[i] = (observations[i]/max(observations))*100
                }

ggplot(plot_data,aes(x = x, y = y)) +
  geom_point(aes(size = size, color = colour)) +
  scale_size_identity() +
  scale_y_continuous (limits = c(0.5, 1.5)) +
  theme(legend.position = "none")     

这会生成靶心类型的图像。

我的方法是尝试找出圆半径的计算方法,然后为每个条目更新 for 循环中的 y 值,以便所有圆在底部接触 - 这就是我一直在做的失败。

所以我的问题是: 我怎样才能算出每个圆的 y 坐标需要是多少?

感谢您的帮助和提示。

我认为这简化了 Henrick 找到的答案:

circle <- function(center, radius, group) {
  th <- seq(0, 2*pi, len=200)
  data.frame(group=group,
             x=center[1] + radius*cos(th),
             y=center[2] + radius*sin(th))
}

# Create a named vector for your values
obs <- c(Org1=500, Org2=850, Org3=50, Org4=200)

# this reverse sorts them (so the stacked layered circles work)
# and makes it a list
obs <- as.list(rev(sort(obs)))

# need the radii
rads <- lapply(obs, "/", 2)

# need the max
x <- max(sapply(rads, "["))

# build a data frame of created circles
do.call(rbind.data.frame, lapply(1:length(rads), function(i) {
  circle(c(x, rads[[i]]), rads[[i]], names(rads[i]))
})) -> dat

# make the plot

gg <- ggplot(dat)
gg <- gg + geom_polygon(aes(x=x, y=y, group=group, fill=group), 
                        color="black")
gg <- gg + coord_equal()
gg <- gg + ggthemes::theme_map()
gg <- gg + theme(legend.position="right")
gg

您可以使用标准 ggplot 函数调整 guides/colors。