堆积气泡图,"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。
初次接触编程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。