我不知道这段代码比你链接的线程中的答案短了多少,但它至少使用了 sf 包。cowplot
这是使用该软件包的一种替代方法。我将饼图视为以下插图:https ://www.r-spatial.org/r/2018/10/25/ggplot2-sf-3.html
library(sf)
library(tidyr)
library(dplyr)
library(ggplot2)
library(cowplot)
states <- sf::st_as_sf(maps::map("state", plot = FALSE, fill = TRUE))
state_coords <- st_coordinates(st_centroid(states)) %>%
data.frame(stringsAsFactors = FALSE) %>%
mutate(ID = states$ID) %>%
mutate(X = (abs(abs(X) - abs(st_bbox(states)$xmin)) /
as.numeric(abs(st_bbox(states)$xmin) - abs(st_bbox(states)$xmax))) - 0.5,
Y = abs(abs(abs(Y) - abs(st_bbox(states)$ymin)) /
as.numeric(abs(st_bbox(states)$ymin) - abs(st_bbox(states)$ymax))
))
dt <- data.frame(Territory = c(1, 2, 3, 4, 5),
ID = c("california", "wyoming", "new york",
"kansas", "georgia"),
pins = c(25, 45, 45, 60, 75),
oak = c(45, 50, 45, 20, 15),
land = c(30, 5, 10, 20, 10))
res <- tidyr::gather(dt, key = "key", value = "value", -Territory, -ID) %>%
left_join(state_coords)
make_pie <- function(dt, title = NA, legend.position = 0){
if(is.na(title)){
title <- unique(dt$ID)
}
ggplot() +
geom_bar(data = dt,
aes(x = "", y = value, fill = key),
stat = "identity", width = 1) +
coord_polar("y") +
theme_void() +
theme(legend.position = legend.position) +
ggtitle(title)
}
terr1 <- make_pie(dplyr::filter(res, Territory == 1))
terr2 <- make_pie(dplyr::filter(res, Territory == 2))
terr3 <- make_pie(dplyr::filter(res, Territory == 3))
terr4 <- make_pie(dplyr::filter(res, Territory == 4))
terr5 <- make_pie(dplyr::filter(res, Territory == 5))
(gg_states <- ggplot(data = states) +
geom_sf() +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0 )) +
theme(legend.position = 0,
plot.margin = unit(c(0,0,0,0), "cm"))
)
leg <- get_legend(make_pie(res, "", legend.position = "left"))
draw_plot_loc <- function(plot, dt){
draw_plot(plot, x = dt$X[1], y = dt$Y[1],
height = 0.2)
}
(all <-
ggdraw(gg_states) +
draw_plot_loc(terr1, dplyr::filter(res, Territory == 1)) +
draw_plot_loc(terr2, dplyr::filter(res, Territory == 2)) +
draw_plot_loc(terr3, dplyr::filter(res, Territory == 3)) +
draw_plot_loc(terr4, dplyr::filter(res, Territory == 4)) +
draw_plot_loc(terr5, dplyr::filter(res, Territory == 5))
)
cowplot::plot_grid(all, leg, rel_widths = c(1, 0.1))
我在地理坐标和 0-1 网格之间进行了蛮力计算,draw_plot
但它并不完美。