我有一个包含三列的数据框:city_name,经度,纬度。我使用ggplot尝试使用经度和纬度作为坐标来可视化数据,它们代表给定的城市。我还想用城市名称标记每个点。不幸的是,比例尺不太正确,因此将点映射到正确的位置。
数据框的示例数据:
city_name <- c("Berlin", "Brussels", "Paris")
longitude <- c("13.405", "4.3517", "2.3522")
latitude <- c("52.52", "50.8503", "48.8566")
df <- data.frame(city_name, longitude, latitude)
我正在使用ggplot2。
mapWorld <- borders("world", colour="gray50", fill="gray50") # create a layer of borders
ggplot(df, aes(x= longitude, y= latitude, label=Name))+
geom_point() +geom_text(aes(label=city_name),hjust=0, vjust=0) + mapWorld
当前结果: https://imgur.com/K3RvqTm
预期结果将是将坐标映射到其正确位置。
谢谢大家!
答案 0 :(得分:2)
该问题似乎源于您的纬度和经度数据的格式。不用引用每个坐标,只需引用它们而不用引号即可。
我还建议leaflet
使用更广泛的映射功能。下面的代码对我有用:
longitude <- c(13.405, 4.3517, 2.3522)
latitude <- c(52.52, 50.8503, 48.8566)
df <- data.frame(city_name, longitude, latitude)
library(leaflet)
df$longitude<-as.numeric(df$longitude)
df$latitude<-as.numeric(df$latitude)
leaflet() %>%
addTiles()%>%
addMarkers(data=df,lng=~longitude,lat=~latitude) %>%
setView(10,50,zoom=4)
答案 1 :(得分:0)
在已经提供的解决方案之上,您可能会发现研究sf
软件包很有帮助,我认为这使空间数据的使用更加愉快。例如,您可以这样做:
library(ggrepel)
library(sf)
library(ggplot2)
mapWorld <- borders("world", colour="gray50", fill="gray50") # create a layer of borders
# define data frame ensuring lat and lon are numeric vectors
df <- data.frame(city_name = c("Berlin", "Brussels", "Paris"),
longitude = c(13.405, 4.3517, 2.3522),
latitude = c(52.52, 50.8503, 48.8566))
# convert into an sf object, letting it know the columns we want to use for X and Y
# setting crs = 4326 for lon/lat data and remove = F to stop those columns from being dropped
df_sf <- st_as_sf(df, coords=c('longitude', 'latitude'), crs = 4326, remove = F)
# it plays nicely with ggplot via the 'geom_sf' geom
ggplot(df_sf)+
mapWorld +
geom_sf() +
geom_text_repel(aes(x=longitude, y=latitude,label=city_name))
您会注意到sf
对象带有自己的“ geometry”列,该列可以被识别并与ggplot很好地配合使用。需要注意的一件事是您对图层的顺序要小心-通过将mapWorld作为最后一层添加到ggplot中,它将出现在绘图的最顶部,并且可能会覆盖您的点!