(using languages but also about using with tmap and ggplot)

This vignette shows how rnaturalearth makes it easier to make maps with labels in languages other than Engish, and to make thematic maps if you have data that is referenced in languages other than Engish.

rnaturalearth is an R package to hold and facilitate interaction with natural earth vector map data.

Natural Earth is a public domain map dataset including vector country boundaries.

load required packages

testing showing a table of available data

physical vector data available via ne_download()
layer scale10 scale50 scale110
antarctic_ice_shelves_lines 1 1 0
antarctic_ice_shelves_polys 1 1 0
coastline 1 1 1
geographic_lines 1 1 1
geography_marine_polys 1 1 1
geography_regions_elevation_points 1 1 1
geography_regions_points 1 1 1
geography_regions_polys 1 1 1
glaciated_areas 1 1 1
lakes 1 1 1
lakes_europe 1 0 0
lakes_historic 1 1 0
lakes_north_america 1 0 0
lakes_pluvial 1 0 0
land 1 1 1
land_ocean_label_points 1 0 0
land_ocean_seams 1 0 0
land_scale_rank 1 0 0
minor_islands 1 0 0
minor_islands_coastline 1 0 0
minor_islands_label_points 1 0 0
ocean 1 1 1
ocean_scale_rank 1 0 0
playas 1 1 0
reefs 1 0 0
rivers_europe 1 0 0
rivers_lake_centerlines 1 1 1
rivers_lake_centerlines_scale_rank 1 1 0
rivers_north_america 1 0 0
cultural vector data available via ne_download()
layer scale10 scale50 scale110
admin_0_antarctic_claim_limit_lines 1 0 0
admin_0_antarctic_claims 1 0 0
admin_0_boundary_lines_disputed_areas 1 1 0
admin_0_boundary_lines_land 1 1 1
admin_0_boundary_lines_map_units 1 0 0
admin_0_boundary_lines_maritime_indicator 1 1 0
admin_0_boundary_map_units 0 1 0
admin_0_breakaway_disputed_areas 0 1 0
admin_0_countries 1 1 1
admin_0_countries_lakes 1 1 1
admin_0_disputed_areas 1 0 0
admin_0_disputed_areas_scale_rank_minor_islands 1 0 0
admin_0_label_points 1 0 0
admin_0_map_subunits 1 1 0
admin_0_map_units 1 1 1
admin_0_pacific_groupings 1 1 1
admin_0_scale_rank 1 1 1
admin_0_scale_rank_minor_islands 1 0 0
admin_0_seams 1 0 0
admin_0_sovereignty 1 1 1
admin_0_tiny_countries 0 1 1
admin_0_tiny_countries_scale_rank 0 1 0
admin_1_label_points 1 0 0
admin_1_seams 1 0 0
admin_1_states_provinces 1 1 1
admin_1_states_provinces_lakes 1 1 1
admin_1_states_provinces_lines 1 1 1
admin_1_states_provinces_scale_rank 1 1 1
airports 1 1 0
parks_and_protected_lands_area 1 0 0
parks_and_protected_lands_line 1 0 0
parks_and_protected_lands_point 1 0 0
parks_and_protected_lands_scale_rank 1 0 0
populated_places 1 1 1
populated_places_simple 1 1 1
ports 1 1 0
railroads 1 0 0
railroads_north_america 1 0 0
roads 1 0 0
roads_north_america 1 0 0
time_zones 1 0 0
urban_areas 1 1 0
urban_areas_landscan 1 0 0

Country maps with labels in other languages

#eval FALSE while testing

# Africa
sp::plot(ne_countries(continent = 'africa'))

sfaf <- ne_countries(continent = 'africa', returnclass = 'sf')
sfafc <- st_centroid(sfaf)

sfaf <- cbind(sfaf, st_coordinates(st_centroid(sfaf$geometry)))

#G = cbind(G, st_coordinates(st_centroid(G$geometry)))

#this adds centroids in the middle of countries
ggplot(sfaf) +
  geom_sf() +
  geom_sf(data=sfafc)

#trying labels in the middle of countries, doesn't quite work needs x,y,label
#but once x & y added on with st_coordinates ...
#seems getting the coords might not be necessary for much longer https://github.com/slowkow/ggrepel/issues/111
#cool nearly there ...
ggplot(sfaf) +
  geom_sf() +
  geom_text_repel(aes(x=X, y=Y, label=name))
  #geom_text_repel(data=sfafc, aes(x=X, y=Y, label=name))
  #geom_label_repel(data=sfafc, aes(x=X, y=Y, label=name))
  #geom_text(data=sfafc, label='name_es', x='X', y='Y')

#getting there, labels still overlap a bit 
#maybe make map bigger to allow space for labels
ggplot(sfaf) +
     geom_sf() +
     geom_text_repel(aes(x=X, y=Y, label=name_es))

# point.padding=NA allows labels to overlap the centroid
ggplot(sfaf) +
     geom_sf() +
     geom_text_repel(aes(x=X, y=Y, label=name_es), point.padding = NA)

#Africa labels just down left & right sides
#works pretty well I think
ggplot(sfaf) +
  geom_sf() +
  xlim(-28,61) +
  geom_text_repel(aes(x=X, y=Y, label=name_es),
    data          = subset(sfaf, X > 21),
    nudge_x       = 60 - subset(sfaf, X > 21)$X,
    segment.size  = 0.2,
    segment.color = "grey50",
    direction     = "y",
    hjust         = 0
  ) +
  geom_text_repel(aes(x=X, y=Y, label=name_es),
    data          = subset(sfaf, X < 21),
    nudge_x       = -19 - subset(sfaf, X < 21)$X,
    segment.size  = 0.2,
    segment.color = "grey50",
    direction     = "y",
    hjust         = 1
  )

#french labels
ggplot(sfaf) +
  geom_sf() +
  xlim(-28,61) +
  geom_text_repel(aes(x=X, y=Y, label=name_fr),
    data          = subset(sfaf, X > 21),
    nudge_x       = 60 - subset(sfaf, X > 21)$X,
    segment.size  = 0.2,
    segment.color = "grey50",
    direction     = "y",
    hjust         = 0
  ) +
  geom_text_repel(aes(x=X, y=Y, label=name_fr),
    data          = subset(sfaf, X < 21),
    nudge_x       = -19 - subset(sfaf, X < 21)$X,
    segment.size  = 0.2,
    segment.color = "grey50",
    direction     = "y",
    hjust         = 1
  )



#tmap good but labels currently overlap

#english labels
tm_shape(sfaf) +
  tm_borders() +
  tm_text("name")

#spanish labels
tm_shape(sfaf) +
     tm_borders() +
     tm_text("name_es")

#other languages de, fr, nl, 
tm_shape(sfaf) +
     tm_borders() +
     tm_text("name_de", size=0.5)

#chinese labels don't currently work, because attribute data is filled with NA
#I suspect I may need to do something different on reading the data in ?
# tm_shape(sfaf) +
#      tm_borders() +
#      tm_text("name_zh")

# The full list of
#    languages is: name_ar, name_bn, name_de, name_en, name_es, name_fr, name_el,
#    name_hi, name_hu, name_id, name_it, name_ja, name_ko, name_nl, name_pl,
#    name_pt, name_ru, name_sv, name_tr, name_vi, and name_zh.
# A 2-character language code decoder ring is here:https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes.