ggplot,sf包,如何在地图上制作简单的饼图 [英] ggplot, sf package, How make simple pie graph on map

查看:82
本文介绍了ggplot,sf包,如何在地图上制作简单的饼图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  data<-data.frame(区域= c(1,2,3,4,5),销= c(25,45,45,60,75),橡木= c(45,50,45,20,15),土地= c(30,5,10,20,10),和= 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),color ="coral4",size = 4) 

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

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

谢谢!

解决方案

我不知道此代码比您链接的线程中的答案短多少,但它至少使用sf包.这是使用 cowplot 包的一种替代方法.我将饼图视为插入图,如下所示:

我有很多方法可以强制在地理坐标和 draw_plot 0-1网格之间进行计算,但这并不完美.

I would like to make pie graph with ggplot and sf package. I have very simple data and un think there is simple method to do. All my data are pourcent :

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))

And my graph code :

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) 

In my shapefile I have information about n° of territory, so I didn't need to put longitude and latitude information. When I used geom_sf_text, labels are placed in the center of each sub-part of map, and and this is where I would like to put my pies.

Do you know a simple method to help me please?

thanks !

解决方案

I don't know how much shorter this code is than the answers in the thread you linked but it at least uses the sf package. Here is one alternative using the cowplot package. I treated the pie charts like inset plots following: 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))

I got most of the way there brute forcing the calculation between geographic coordinates and the draw_plot 0-1 grid but it's not perfect.

这篇关于ggplot,sf包,如何在地图上制作简单的饼图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆