将坐标映射到世界地图并贴上标签

时间:2019-06-20 20:28:37

标签: r ggplot2 visualization

我有一个包含三列的数据框: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

预期结果将是将坐标映射到其正确位置。

谢谢大家!

2 个答案:

答案 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中,它将出现在绘图的最顶部,并且可能会覆盖您的点!

enter image description here