我在您的代码中发现了一些错误,首先您的 dat 数据框包含字符串格式的 x 和 y 值,并且不是数字(这在绘图时无济于事!)。
其次,与其他 GIS 软件不同,R 不进行 On the fly 投影转换!因此,将您的点与 LAT LONG 一起使用对您的 shapefile 不起作用,因为它在不同的 CRS 中!这是北极圈的 CRS:
proj4string: +proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs
所以,我所做的就是将你的 LAT LONG 点文件转换为上面显示的 CRS,然后制作 ggplot,我将把所有代码放在下面,并附上注释:
library(ggplot2)
library(rgdal)
library(ggmap)
library(sp)
library(dplyr)
library(ggspatial) #To use geom_sf to add shapefiles
#### Breaking apart all the values
x = c(-21.5,19.0,-161.5,-147.5)
y = c(70.5,74.5,58.5,60.5)
Type =c("A","B","A","B")
### Creating spatial LAT LONG coordinates, which will be converted to Lambert Conformal Conic Projection below
dat <- data.frame(lon = x, lat = y)
#### Creating LAT LONG SpatialPoints
coordinates(dat) = c("lon", "lat")
proj4string(dat) <- CRS("+init=epsg:4326")
#### The coordinate reference system, that is used in your shapefile. Will use this when converting the spatial points
polar = "+proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0"
### Converting the LAT LONG to the polar CRS shown above
polar_dat = spTransform(dat, polar)
polar_dat = as.data.frame(polar_dat)
#### Adding the Type column back to the data frame, with the new polar coordinates
polar_dat = data.frame(polar_dat, Type)
#### Reading in the Circle Shapefile
ArcticCircle = st_read("P:\\SHP\\LCC_AC\\LCC_AC.shp")
### Putting it togather in ggplot
p <- ggplot()+
geom_point(data = polar_dat, aes(x = lon, y = lat, colour = Type))+
geom_sf(data = ArcticCircle, linetype = "dashed", aes())+
xlab("Longitude")+
ylab("Latitude")
这就是情节最终的样子:
希望这会有所帮助,如果有任何不清楚的地方,请告诉我!
编辑:带有底图的新代码(感谢 Majid 提供数据)
library(ggplot2)
library(rgdal)
library(ggmap)
library(sp)
library(dplyr)
library(ggspatial)
library(sf)
library(rnaturalearth)
library(rnaturalearthdata)
#### Breaking apart all the values
x = c(-21.5,19.0,-161.5,-147.5)
y = c(70.5,74.5,58.5,60.5)
Type =c("A","B","A","B")
### Creating spatial LAT LONG coordinates, which will be converted to Lambert Conformal Conic Projection below
dat <- data.frame(lon = x, lat = y)
#### Creating LAT LONG SpatialPoints
coordinates(dat) = c("lon", "lat")
proj4string(dat) <- CRS("+init=epsg:4326")
#### The coordinate reference system, that is used in your shapefile. Will use this when converting the spatial points
polar = "+proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0"
b <- bbox(dat)
### Converting the LAT LONG to the polar CRS shown above
polar_dat = spTransform(dat, polar)
polar_dat = as.data.frame(polar_dat)
#### Adding the Type column back to the data frame, with the new polar coordinates
polar_dat = data.frame(polar_dat, Type)
#### Reading in the Circle Shapefile
ArcticCircle = st_read("P:\\SHP\\LCC_AC\\LCC_AC.shp")
### Getting basemap shapefile
world <- ne_countries(scale = "medium", returnclass = "sf")
world_cropped <- st_crop(world, xmin = -180.0, xmax = 180.0,
ymin = 45.0, ymax = 90.0)
### Plotting it all togather
p = ggplot(data = world_cropped) +
geom_sf(colour = "#6380ad", fill = "#9cb3db") +
geom_sf(data = ArcticCircle, linetype = "dashed", aes())+
geom_point(data = polar_dat, aes(x = lon, y = lat, colour = Type))+
coord_sf(crs =
"+proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0")