【发布时间】:2016-06-24 15:32:27
【问题描述】:
我可以合并三个没有任何图例的图,但是当我将图例添加到其中两个图时,我无法合并它们。如何将一些有图例的情节与没有图例的情节结合起来?
这是我如何组合没有图例的图的示例:
library(ggplot2)
map_data <- data.frame(lon = c(-177.5, -172.5, -167.5, -162.5, -157.5, -152.5),
lat = c(87.5, 87.5, 87.5, 87.5, 87.5, 87.5),
ssta = c(-2.78999996, 0.09999999, 0.19999999, 0.06000000, 1.65999997, -0.41000000))
# one map
p.1 <- ggplot() +
borders("world",
colour="black",
fill="white") +
geom_tile(data = map_data,
aes(lon,
lat)) + # no fill value so no legend
coord_fixed() +
scale_fill_viridis(na.value = "transparent") +
theme_minimal()
# a second map, the same general shape
p.2 <- p.1
# a line plot
library(lubridate)
time_sequence <- seq(dmy("01-01-1800"),
dmy("01-01-1960"),
by = 'month')
long_plot_data <- data.frame(variable = seq(dmy("01-01-1800"),
dmy("01-01-1960"),
by = 'month'),
value = runif(length(time_sequence)),
col = runif(length(time_sequence)))
p.3 <- ggplot(long_plot_data,
aes(variable,
value)) +
geom_line() +
theme_minimal()
# combine plots
library(grid)
grid.newpage()
grid.draw(rbind(ggplotGrob(p.1),
ggplotGrob(p.2),
ggplotGrob(p.3),
size = "last"))
现在,如果我向地图图添加填充值,我会得到一个图例,当我尝试以相同方式组合时会出现错误:
# one map
p.1 <- ggplot() +
borders("world",
colour="black",
fill="white") +
geom_tile(data = map_data,
aes(lon,
lat,
fill = ssta)) + # gives a legend
coord_fixed() +
scale_fill_viridis(na.value = "transparent") +
theme_minimal()
这是这样的:
# a second map, the same general shape
p.2 <- p.1
# a line plot
library(lubridate)
time_sequence <- seq(dmy("01-01-1800"),
dmy("01-01-1960"),
by = 'month')
long_plot_data <- data.frame(variable = seq(dmy("01-01-1800"),
dmy("01-01-1960"),
by = 'month'),
value = runif(length(time_sequence)),
col = runif(length(time_sequence)))
p.3 <- ggplot(long_plot_data,
aes(variable,
value)) +
geom_line() +
theme_minimal()
现在我尝试将两张带有图例的地图和没有图例的线图结合起来:
# combine plots
library(grid)
grid.newpage()
grid.draw(rbind(ggplotGrob(p.1),
ggplotGrob(p.2),
ggplotGrob(p.3),
size = "last"))
输出为Error: ncol(x) == ncol(y) is not TRUE
但如果我在折线图中添加一个图例,让所有三个图都有图例,我可以将它们组合起来:
p.3 <- ggplot(long_plot_data,
aes(variable,
value,
colour = col)) +
geom_line() +
theme_minimal()
# combine plots
library(grid)
grid.newpage()
grid.draw(rbind(ggplotGrob(p.1),
ggplotGrob(p.2),
ggplotGrob(p.3),
size = "last"))
如何将两个有图例的图与一个没有图例的图结合起来?
【问题讨论】:
-
您可能需要将图例移动到单独的 grob 中,然后使用 grid 将其放置在左侧,并在其下方有两个空白 grob(超级超级hacky),类似于github.com/hadley/ggplot2/wiki/…
-
在 gtihub 上查看 @baptiste 的
egg包,available here。