R语言 如何在ggplot上获得多种图标类型?

ryhaxcpt  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(139)

希望这是一个非常简单的解决方案。我对R Studio完全陌生,甚至不完全理解我目前所拥有的代码。请让我知道如果我需要给予更多的信息。
我在绘制不同植物种类的位置数据,按年代给它们上色。我还需要把三角形的植物标本馆和圆圈的植物观察在野外。这就是我目前所拥有的,沿着它所产生的图像。
在我的数据中,我有一个名为“basisOfRecord”的列,其中有两个类别,即人类观察或保存的标本。如何更改代码来分配Map图标?我有点被这个项目扔给了我,并且在没有R基础的情况下一直在混乱地搜索,甚至没有一般的编码,所以如果我的脚本真的很混乱,我很抱歉。
这里是Map数据的链接-https://www.dropbox.com/scl/fo/v2v8x3zy4uhlw3mtan28l/h?rlkey=60g8s28z1mix9co2podjkb16p&dl=0
这里是一个链接到CSV -https://www.dropbox.com/scl/fi/9t7qpxo1113uban1qpsib/americanus.csv?rlkey=nguai55lmlsc23i48h1j2zeee&dl=0

library(tidyverse)
library(lubridate)
library(viridis)
library(sf) 

americanus <- read.csv("C:/Users/MayeJ/Documents/Map Data/GBIF/Americanus/americanus.csv")  

month <- 1  
day <- 1
americanus$TrueDate <- as.Date(paste(americanus$TrueDate, month, day, sep = "-"))
print(americanus$TrueDate)

americanus <- americanus[complete.cases(americanus$decimalLatitude, americanus$decimalLongitude), ]

obs.year = lubridate::year(americanus$TrueDate) 
decade.cha = as.character(floor(obs.year / 10) * 10) 
decade = (floor(obs.year / 10) * 10)
americanus <- st_as_sf(americanus, coords = c("decimalLongitude", "decimalLatitude"), crs = 4326)

crs = "WGS84"
agr = "constant"
remove = F


class(americanus)

north.america.bound <- st_read("/Users/MayeJ/Documents/Map Data/NA_PoliticalDivisions/NA_PoliticalDivisions/data/bound_l/boundary_l_v2.shp")


americanus.map <- ggplot(data = north.america.bound) + 

  theme_bw() + 
  geom_sf(fill = "gray90", color = "black") + 
  geom_sf(data = americanus, 
          size = 3, 
          shape = 21, 
          alpha = 0.7, 
          aes(fill = decade.cha)) + 
  scale_fill_viridis(option = "B", discrete = T, direction = 1) +

  coord_sf(xlim = c(-3235000, 3062000),
           ylim = c(-900000, 4007000)) 

americanus.map


ggsave(plot = americanus.map,
       "C:/Users/MayeJ/Documents/Map Data/GBIF/Americanus/americanusmap.jpg",
       device = "jpg", dpi = 300, units = "in",
       width = 10, height = 7.5)

字符串
Here is the map
我试着寻找使用ggplots和sf的Map示例,看看它们是否同时使用多个符号,但还没有找到任何东西。我只是没有任何形式的编码格式的直觉,所以我甚至不知道从哪里开始实验。

hi3rlvi2

hi3rlvi21#

问题是basisOfRecord列有六个类别。四个只是PreservedSpecimen的不同版本(例如:也有"preservedspecimen"),然后有"HumanObservation",最后一个叫做"voucher"。因此,当只为shape提供两个值时(正如我在评论中所建议的那样),你会得到一个错误,而当不包括scale_shape_manual时,你会得到前六个默认形状,它们只支持color aes,而不支持fill
在下面的代码中,我将"PreservedSpecimen"的四个变体重新编码为一个类别"PreservedSpecimen",并为"voucher"添加了另一个形状值。然而,仍然有一个填充颜色没有显示在图例中的问题,我使用guides(fill = guide_legend(override.aes = list(shape = 21)))修复了这个问题。此外,我简化了你的代码,特别是十年的计算,最后我把图例放在底部。

library(tidyverse)
library(sf)

americanus <- read.csv("americanus.csv")
americanus <- americanus[c("TrueDate","decimalLatitude", "decimalLongitude", "basisOfRecord")]

americanus$decade.cha <- factor(10 * americanus$TrueDate %/% 10)

americanus <- americanus[complete.cases(americanus$decimalLatitude, americanus$decimalLongitude), ]

americanus <- st_as_sf(americanus, coords = c("decimalLongitude", "decimalLatitude"), crs = 4326)

north.america.bound <- st_read("PoliticalBoundaries_Shapefiles/NA_PoliticalDivisions/data/bound_l/boundary_l_v2.shp")

americanus$basisOfRecord[grepl("^(P|p)reserve", americanus$basisOfRecord)] <- "PreservedSpecimen"
ggplot(north.america.bound) +
  geom_sf(fill = "gray90", color = "black") +
  geom_sf(
    data = americanus,
    aes(fill = decade.cha, shape = basisOfRecord),
    size = 3,
    alpha = 0.7
  ) +
  scale_shape_manual(values = c(21, 24, 22)) +
  scale_fill_viridis_d(option = "B", direction = 1) +
  coord_sf(
    xlim = c(-3235000, 3062000),
    ylim = c(-900000, 4007000)
  ) +
  theme_bw() +
  theme(legend.position = "bottom", legend.box = "vertical") +
  guides(fill = guide_legend(override.aes = list(shape = 21)))

字符串


的数据

相关问题