ggplot,sf包,如何在地图上制作简单的饼图 [英] ggplot, sf package, How make simple pie graph on map
问题描述
我想用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屋!