ggplot,sf包,如何在地图上制作简单的饼图

时间:2019-06-07 16:13:12

标签: r ggplot2 sf scatterpie

我想用ggplot和sf软件包制作饼图。 我有非常简单的数据,并且不认为有简单的方法可以做。 我所有的数据都是纯净的:

data <- data.frame(Territory = c(1, 2, 3, 4, 5), 
                      Pins = c(25, 45, 45, 60, 75),
                      oak = c(45, 50, 45, 20, 15), 
                      land = c(30, 5, 10, 20, 10), 
                      sum = c(100, 100, 100, 100, 100))

我的图形代码:

read_sf("territories.shp") %>%
  left_join(data, by = "Territory") %>%
  ggplot() +
  geom_sf(aes(fill = Pins), color = "black") + theme_bw() +
  xlab("") + ylab("") +
  scale_fill_distiller(palette = "Spectral") +
  geom_sf_text(aes(label = Territory), colour = "coral4", size = 4) 

在我的shapefile中,我有关于n°领土的信息,因此不需要放置经度和纬度信息。当我使用geom_sf_text时,标签被放置在地图的每个子部分的中心,这就是我想要放置饼图的地方。

您知道一种简单的方法可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

我不知道这段代码比您链接的线程中的答案短多少,但它至少使用sf包。这是使用 if [[ $move_valid = true ]] ; then 包的一种替代方法。我将饼图视为插入图,如下所示:https://www.r-spatial.org/r/2018/10/25/ggplot2-sf-3.html

cowplot

enter image description here

我大部分使用了蛮力方法来强制地理坐标和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网格之间的计算,但这并不完美。