我希望制作一张带有整体标签的谷歌地图,并且标签具有不同的字体大小。 例如,请考虑以下代码,这些代码基于Max Marchi在博客文章(link)中提供的代码:
# Load the data
airports <- read.csv("https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat", header = FALSE)
colnames(airports) <- c("ID", "name", "city",
"country", "IATA_FAA", "ICAO", "lat", "lon",
"altitude", "timezone", "DST")
routes <- read.csv("https://github.com/jpatokal/openflights/raw/master/data/routes.dat", header = FALSE)
colnames(routes) <- c("airline", "airlineID",
"sourceAirport", "sourceAirportID",
"destinationAirport", "destinationAirportID",
"codeshare", "stops", "equipment")
# Getting the data ready for plotting
# * For a detailed explanation on setting up the data
# I suggest consulting Max Marchi's post:
# http://www.milanor.net/blog/maps-in-r-plotting-data-points-on-a-map/
library(plyr)
departures <- ddply(routes, .(sourceAirportID), "nrow")
names(departures)[2] <- "flights"
arrivals <- ddply(routes, .(destinationAirportID), "nrow")
names(arrivals)[2] <- "flights"
airportD <- merge(airports, departures, by.x = "ID",
by.y = "sourceAirportID")
airportA <- merge(airports, arrivals, by.x = "ID",
by.y = "destinationAirportID")
airportD$type <- "departures"
airportA$type <- "arrivals"
# The final data frame used for plotting
airportDA <- rbind(airportD, airportA)
# Get the map of Europe from Google Maps
library(ggmap)
map <- get_map(location = 'Europe', zoom = 4)
# Make a facetted Google map plot
library(ggplot2)
facet.gmap <- ggmap(map) +
geom_point(aes(x = lon, y = lat,
size = sqrt(flights)),
data = airportDA, alpha = .5) +
facet_wrap( ~ type, ncol=2) +
theme(legend.position="none")
# Add an overall label with different font sizes
library(gtable)
library(grid)
facet.gmap.label <- ggplotGrob(facet.gmap)
facet.gmap.label <- gtable_add_grob(facet.gmap.label,
grobTree(textGrob("M", x=0.05,
y=0.85,just="left",
gp = gpar(fontsize = 14,
fontface = "bold")),
textGrob("Some label", x=0.18,
y=0.68, just="left",
gp = gpar(fontsize = 9,
fontface = "bold")) ),
t=1, b=4, l=1, r=4)
# Save as PDF
pdf("facet.gmap.label.pdf",
width=4.5,
height=3.6)
grid.draw(facet.gmap.label)
dev.off()
我明白了:
为了减少白色空格并使整个标签可见,我在theme
的{{1}}参数中测试了不同的值,并通过设置{获得了“最佳”(最不好)的图表{1}}:
plot.margin
结果:
底线:尽管我在plot.margin = unit(c(0.8, 0.4, -3.8, 0.3), "lines")
中测试了不同的值,但我仍然没有得到我需要的情节,这将是这样的:
我在图像编辑器软件的帮助下制作了这个最后/期望的情节但是为了我的目标,这不是一个好主意,因为我需要制作几个这些分面的Google地图图;每个都有一个整体标签,标签有不同的字体大小。
有没有人有任何关于如何在R中创建最后一个情节的建议?提前谢谢。
PS1:上图中的黑色边框是使用图像编辑器软件手动绘制的,以突出显示我遇到的白色空白问题。
< / LI>P.S.2:在提供的代码中,我将图表导出为PDF,因为图形是供发布使用的;因此,过多的白色空白并不是一件好事,因为科学期刊通常对图形尺寸有限制。
答案 0 :(得分:2)
为什么不能只使用ggtitle
,它会自动处理保证金增加?
这可以为您提供所需的文本输出,而无需四处寻找您需要的精确x-y坐标:
facet.gmap +
ggtitle(expression(bold(M)~scriptstyle("Some Label") ))
给出你要找的情节。
您似乎遇到的另一个问题是宽高比。 ggmap
(帮助)坚持使用coord_fixed
或类似内容来确保正确保留x到y距离的比率。如果您的输出的宽高比(调用width
中的height
到pdf
)不同,则缩小图以适应最严格的尺寸并保留白色其他地方。我在RStudio的情节窗口摆弄它并在440x287(我曾经导出的)中得到了相当不错的比例。您可以尝试从宽度到高度开始,以保持该近似比率并从那里进行修补。