从 ggpattern 创建图例

问题描述 投票:0回答:1

我创建了一个地图,它迭代各县,并根据伟大的 ggpattern r 包添加颜色和图案,但是我不知道如何创建图例以使用相应的颜色和十六进制图案添加到地图中。我迭代并添加每个县的原因是这样我最终可以控制某些县的模式。如果有更好的方法我也愿意!

library(ggplot2)
library(sf)
library(tidyverse)
library(ggpattern)
library(cowplot)

nc <- st_read(system.file("shape/nc.shp", package="sf"))


nc<-nc%>%mutate(row_id=row_number())

ids=unique(nc$row_id)

##pattern
df1 <- data.frame(
  x    = rep(1:6, 9),
  y    = rep(1:9, each=6),
  name = gridpattern::names_magick,
  stringsAsFactors = FALSE
)

df1<-df1%>%mutate(row_id=row_number())



df_color<-data.frame()

pattern_rand_df_final<-data.frame()


p1 <- ggplot()

ids=1:10

for(id in ids){
  df <- nc%>%filter(id==row_id)
  x=paste(sample(0:255,size=1,replace=TRUE),collapse=" ")
  y=paste(sample(0:255,size=1,replace=TRUE),collapse=" ")
  z=paste(sample(0:255,size=1,replace=TRUE),collapse=" ")
  
  zz=rgb(x,y,z, maxColorValue = 255)
  df_color<<-rbind(df_color,zz)
  df_color=df_color%>%mutate(row_id=row_number())
  df_color_f<-  df_color%>%filter(row_id==id)
  colnames(df_color_f)[1]='fill_color'
    
  num_rand=sample(1:54,1)
  pattern_rand_df_final<<-rbind(pattern_rand_df_final,num_rand)
  pattern_rand_df_final=pattern_rand_df_final%>%mutate(row_id=row_number())
  pattern_rand_df_final_filter<-  pattern_rand_df_final%>%filter(row_id==id)
  colnames(pattern_rand_df_final_filter)[1]='random_pattern'
  
  df1_f<-df1%>%filter(row_id==pattern_rand_df_final_filter$random_pattern)


  
p1<-p1 +  geom_sf_pattern(data = df, fill=df_color_f$fill_color, color = "black",pattern='magick',
                          pattern_type = I(df1_f$name))


}

##this creates the map 
p1

legend_df<-full_join(df_color,pattern_rand_df_final)

colnames(legend_df)[1]='color_fill'
colnames(legend_df)[3]='hex_fill_number_id'


legend_df<-left_join(legend_df,df1%>%select(name,row_id),by=c("hex_fill_number_id"="row_id"))

###this is the legend information i would like to add using cowplot 
legend_df<-left_join(legend_df,st_drop_geometry(nc)%>%select(row_id,NAME)%>%rename(county=NAME))

r ggplot2 ggpattern
1个回答
0
投票

作为一般规则,如果你想要一个图例,那么就在美学上进行映射。也就是说,一种选择和一种可能更简单的方法是创建两个填充颜色和图案的命名向量,将颜色和/或图案分配给县名。然后将县

NAME
映射到
fill
pattern_type
内的
aes()
aes,并使用
scale_xxx_manual
应用您想要的颜色和图案:

library(ggplot2)
library(sf)
library(ggpattern)

set.seed(123)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

pal_color <- rgb(
  sample(255, nrow(nc), replace = TRUE),
  sample(255, nrow(nc), replace = TRUE),
  sample(255, nrow(nc), replace = TRUE),
  maxColorValue = 255
)

n_counties <- 10

dat_map <- nc |>
  head(n_counties)

pal_color <- pal_color[seq_len(n_counties)]
pal_pattern <- sample(gridpattern::names_magick, n_counties)

names(pal_color) <- names(pal_pattern) <- dat_map$NAME

ggplot() +
  geom_sf_pattern(
    data = dat_map,
    aes(
      fill = NAME,
      pattern_type = NAME
    ),
    color = "black", pattern = "magick",
  ) +
  scale_fill_manual(values = pal_color) +
  scale_pattern_type_manual(values = pal_pattern) +
  theme(legend.position = "bottom")

© www.soinside.com 2019 - 2024. All rights reserved.