将标签放在 polygonswuth ggplot2 之外?即在海中或在地图的角落
Putting labels outside polygonswuth ggplot2? i.e. in the sea or in corners of map
我想制作带有标签的地图,但我不想要多边形中的标签。有什么方法可以让标签在多边形之外?
此处可重现示例:
require(maps)
require(ggplot2)
require(ggrepel)
set.seed(1)
world <- map_data("world")
world <- world[world$region != "Antarctica",]
cities <- structure(list(city = c("Dallas", "Johannesburg", "Abu Dhabi",
"Dubai", "Jeddah", "Doha", "New York", "Newark", "Boston", "Houston",
"Los Angeles", "Toronto", "Mumbai", "Chicago", "Sydney", "Atlanta",
"San Francisco", "Hong Kong", "Guangzhou", "Taipei", "Melbourne"
), lon = c(-96.7969879, 28.0473051, 54.6972774, 55.2707828, 39.2375507,
51.5310398, -74.0059413, -74.1723667, -71.0588801, -95.3698028,
-118.2436849, -79.3831843, 72.8776559, -87.6297982, 151.2069902,
-84.3879824, -122.4194155, 114.109497, 113.264385, 121.5654177,
144.96328), lat = c(32.7766642, -26.2041028, 24.2991738, 25.2048493,
21.2854067, 25.2854473, 40.7127837, 40.735657, 42.3600825, 29.7604267,
34.0522342, 43.653226, 19.0759837, 41.8781136, -33.8674869, 33.7489954,
37.7749295, 22.396428, 23.12911, 25.0329694, -37.814107)),
class = "data.frame", .Names = c("city", "lon", "lat"), row.names = c(NA, -21L))
ggplot() +
geom_map(data=world, map=world, aes(x=long, y=lat, map_id=region), fill = 'grey70') +
coord_map("mollweide") +
geom_text_repel(data = cities, aes(lon, lat, label = city), size = 3,
box.padding = unit(0.1, 'lines'), force = 0.5)
但我想要陆地以外的标签。
问题是 geom_text_repel
不知道陆地质量,即您通过数据参数仅传递有关 cities
的信息。
如果你想 geom_text_repel
做好工作,你必须让它了解土地或更普遍的所有数据。为此,我将两个数据帧(world
和 cities
)绑定在一起。不完美但...
require(maps)
#> Loading required package: maps
require(ggplot2)
#> Loading required package: ggplot2
require(ggrepel)
#> Loading required package: ggrepel
set.seed(1)
world <- map_data("world")
world <- world[world$region != "Antarctica",]
cities <- structure(list(city = c("Dallas", "Johannesburg", "Abu Dhabi",
"Dubai", "Jeddah", "Doha", "New York", "Newark", "Boston", "Houston",
"Los Angeles", "Toronto", "Mumbai", "Chicago", "Sydney", "Atlanta",
"San Francisco", "Hong Kong", "Guangzhou", "Taipei", "Melbourne"
), lon = c(-96.7969879, 28.0473051, 54.6972774, 55.2707828, 39.2375507,
51.5310398, -74.0059413, -74.1723667, -71.0588801, -95.3698028,
-118.2436849, -79.3831843, 72.8776559, -87.6297982, 151.2069902,
-84.3879824, -122.4194155, 114.109497, 113.264385, 121.5654177,
144.96328), lat = c(32.7766642, -26.2041028, 24.2991738, 25.2048493,
21.2854067, 25.2854473, 40.7127837, 40.735657, 42.3600825, 29.7604267,
34.0522342, 43.653226, 19.0759837, 41.8781136, -33.8674869, 33.7489954,
37.7749295, 22.396428, 23.12911, 25.0329694, -37.814107)),
class = "data.frame", .Names = c("city", "lon", "lat"), row.names = c(NA, -21L))
library(dplyr)
# Bind the dataframes for geom_text_repel.
world_label <- rename(world, lon = long) %>%
mutate(city = "")
data_labels <- bind_rows(world_label, cities, .id = "id" )
ggplot() +
geom_map(data = world, map = world, aes(map_id = region), fill = 'grey70') +
coord_map("mollweide") +
geom_text_repel(data = data_labels, aes(lon, lat, label = city), size = 3, force = 1, seed = 123)
我想制作带有标签的地图,但我不想要多边形中的标签。有什么方法可以让标签在多边形之外?
此处可重现示例:
require(maps)
require(ggplot2)
require(ggrepel)
set.seed(1)
world <- map_data("world")
world <- world[world$region != "Antarctica",]
cities <- structure(list(city = c("Dallas", "Johannesburg", "Abu Dhabi",
"Dubai", "Jeddah", "Doha", "New York", "Newark", "Boston", "Houston",
"Los Angeles", "Toronto", "Mumbai", "Chicago", "Sydney", "Atlanta",
"San Francisco", "Hong Kong", "Guangzhou", "Taipei", "Melbourne"
), lon = c(-96.7969879, 28.0473051, 54.6972774, 55.2707828, 39.2375507,
51.5310398, -74.0059413, -74.1723667, -71.0588801, -95.3698028,
-118.2436849, -79.3831843, 72.8776559, -87.6297982, 151.2069902,
-84.3879824, -122.4194155, 114.109497, 113.264385, 121.5654177,
144.96328), lat = c(32.7766642, -26.2041028, 24.2991738, 25.2048493,
21.2854067, 25.2854473, 40.7127837, 40.735657, 42.3600825, 29.7604267,
34.0522342, 43.653226, 19.0759837, 41.8781136, -33.8674869, 33.7489954,
37.7749295, 22.396428, 23.12911, 25.0329694, -37.814107)),
class = "data.frame", .Names = c("city", "lon", "lat"), row.names = c(NA, -21L))
ggplot() +
geom_map(data=world, map=world, aes(x=long, y=lat, map_id=region), fill = 'grey70') +
coord_map("mollweide") +
geom_text_repel(data = cities, aes(lon, lat, label = city), size = 3,
box.padding = unit(0.1, 'lines'), force = 0.5)
但我想要陆地以外的标签。
问题是 geom_text_repel
不知道陆地质量,即您通过数据参数仅传递有关 cities
的信息。
如果你想 geom_text_repel
做好工作,你必须让它了解土地或更普遍的所有数据。为此,我将两个数据帧(world
和 cities
)绑定在一起。不完美但...
require(maps)
#> Loading required package: maps
require(ggplot2)
#> Loading required package: ggplot2
require(ggrepel)
#> Loading required package: ggrepel
set.seed(1)
world <- map_data("world")
world <- world[world$region != "Antarctica",]
cities <- structure(list(city = c("Dallas", "Johannesburg", "Abu Dhabi",
"Dubai", "Jeddah", "Doha", "New York", "Newark", "Boston", "Houston",
"Los Angeles", "Toronto", "Mumbai", "Chicago", "Sydney", "Atlanta",
"San Francisco", "Hong Kong", "Guangzhou", "Taipei", "Melbourne"
), lon = c(-96.7969879, 28.0473051, 54.6972774, 55.2707828, 39.2375507,
51.5310398, -74.0059413, -74.1723667, -71.0588801, -95.3698028,
-118.2436849, -79.3831843, 72.8776559, -87.6297982, 151.2069902,
-84.3879824, -122.4194155, 114.109497, 113.264385, 121.5654177,
144.96328), lat = c(32.7766642, -26.2041028, 24.2991738, 25.2048493,
21.2854067, 25.2854473, 40.7127837, 40.735657, 42.3600825, 29.7604267,
34.0522342, 43.653226, 19.0759837, 41.8781136, -33.8674869, 33.7489954,
37.7749295, 22.396428, 23.12911, 25.0329694, -37.814107)),
class = "data.frame", .Names = c("city", "lon", "lat"), row.names = c(NA, -21L))
library(dplyr)
# Bind the dataframes for geom_text_repel.
world_label <- rename(world, lon = long) %>%
mutate(city = "")
data_labels <- bind_rows(world_label, cities, .id = "id" )
ggplot() +
geom_map(data = world, map = world, aes(map_id = region), fill = 'grey70') +
coord_map("mollweide") +
geom_text_repel(data = data_labels, aes(lon, lat, label = city), size = 3, force = 1, seed = 123)