在 facet 中使用 ggpmisc 正确定位 ggplot 插图
correct positioning of ggplot insets with ggpmisc in facet
如何使用 ggpmisc
灵活定位 inset
而不改变插图本身的宽度和高度?
library(tidyverse)
library(sf)
library(ggpmisc)
#data
nc <- st_read(system.file("gpkg/nc.gpkg", package = "sf"), quiet = TRUE) %>%
st_transform(st_crs(4326)) %>%
st_cast('POLYGON')
#create timeseries data
nc_2 <- rbind(nc %>% mutate(timepoint = 1), nc %>% mutate(timepoint = 2))
#create base plot
nc_2_base <- ggplot(data = nc_2) +
geom_sf(aes(fill = BIR74)) +
coord_sf(xlim = c(-80, -76),
ylim = c(32, 37), expand = FALSE)
#facet plot
nc_2_main <- nc_2_base + facet_wrap(~timepoint, dir = "h", ncol = 2)
#extract number of timepoints
nmax_rep_nc <- length(unique(nc_2$timepoint))
#create insets
insets_nc <- lapply(seq_len(nmax_rep_nc), function(i) {
nc_2_base + ggforce::facet_wrap_paginate(~ timepoint, nrow = 1, ncol = 1, page = i) +
coord_sf(xlim = c(-79.5, -78.5), ylim = c(34.5, 35.5)) +
theme(strip.background = element_blank(),
strip.text = element_blank(),
axis.title = element_blank(),
plot.background = element_blank(),
legend.position = "none")
})
要定位插图,您需要创建一个 tibble
,其中 x
、y
指示您想要的位置。在这里,我希望它们位于左下角,因此请指定 x = 0.0
和 y = 0
(x
、y
可以是小插图 here 中的 0 - 1
) 并且我希望插图的大小是主图的 50% (vp.width = 0.5, vp.height = 0.5
):
insets_nc_tibble <- tibble(x = rep(0.0, nmax_rep_nc),
y = rep(0.0, nmax_rep_nc),
plot = insets_nc,
timepoint = unique(nc_2$timepoint))
#add inset to plot:
nc_2_main +
geom_rect(xmin = -79.5, xmax = -78.5, ymin = 34.5, ymax = 35.5,
fill = NA, colour = "red", size = 1.5) +
geom_plot_npc(data = insets_nc_tibble,
aes(npcx = x, npcy = y, label = plot,
vp.width = 0.5, vp.height = 0.5))
产生这个情节:
但是左下角的插图不正确 (0, 0)
我想要的。我怎样才能使插图保持这个大小,但移动它使其直接位于角落?
如果我减小插图的大小似乎会有帮助,但这完全是反复试验,我不想减小插图的大小。
#reduce size
nc_2_main +
geom_rect(xmin = -79.5, xmax = -78.5, ymin = 34.5, ymax = 35.5,
fill = NA, colour = "red", size = 1.5) +
geom_plot_npc(data = insets_nc_tibble,
aes(npcx = x, npcy = y, label = plot,
vp.width = 0.5, vp.height = 0.25))
这产生了这个定位更好但不是我想要的正确尺寸的图:
请注意,您也可以通过字符串指定角,但这没有帮助:
#insets_nc_tibble <- tibble(x = rep("left", nmax_rep_nc),
# y = rep("bottom", nmax_rep_nc),
# plot = insets_nc,
# timepoint = unique(nc_2$timepoint))
这个问题是对我之前的回答和其他回答的跟进 。
我不明白如何改变大小,改变位置。我认为指定 x, y = 0, 0
意味着插图的左下角应该设置为 0, 0
但这里似乎不是这种情况?
有什么想法吗?
谢谢
这看起来像是一个错误。我将调查为什么 x 轴偏移 0.5 度。
这是一个临时解决方法,使用非 noc 版本的 geom 并将 x 坐标移动 -0.5 度:
insets_nc_tibble1 <- tibble(x = rep(-80, nmax_rep_nc),
y = rep(31.5, nmax_rep_nc),
plot = insets_nc,
timepoint = unique(nc_2$timepoint))
#add inset to plot:
nc_2_main +
geom_rect(xmin = -79.5, xmax = -78.5, ymin = 34.5, ymax = 35.5,
fill = NA, colour = "red", size = 1.5) +
geom_plot(data = insets_nc_tibble1,
aes(x = x, y = y, label = plot),
vp.width = 0.5, vp.height = 0.5)
原因是渲染图的网格视口比图本身大。这是 'ggplot2' 中的一个功能还是一个错误很难说,因为 lat 和 lot 否则会被扭曲。可以通过打印ggplot然后运行 grid::showViewport()
看到。这似乎是使用固定坐标的结果,因此插图无法拉伸以填充视口中可用的 space。
如何使用 ggpmisc
灵活定位 inset
而不改变插图本身的宽度和高度?
library(tidyverse)
library(sf)
library(ggpmisc)
#data
nc <- st_read(system.file("gpkg/nc.gpkg", package = "sf"), quiet = TRUE) %>%
st_transform(st_crs(4326)) %>%
st_cast('POLYGON')
#create timeseries data
nc_2 <- rbind(nc %>% mutate(timepoint = 1), nc %>% mutate(timepoint = 2))
#create base plot
nc_2_base <- ggplot(data = nc_2) +
geom_sf(aes(fill = BIR74)) +
coord_sf(xlim = c(-80, -76),
ylim = c(32, 37), expand = FALSE)
#facet plot
nc_2_main <- nc_2_base + facet_wrap(~timepoint, dir = "h", ncol = 2)
#extract number of timepoints
nmax_rep_nc <- length(unique(nc_2$timepoint))
#create insets
insets_nc <- lapply(seq_len(nmax_rep_nc), function(i) {
nc_2_base + ggforce::facet_wrap_paginate(~ timepoint, nrow = 1, ncol = 1, page = i) +
coord_sf(xlim = c(-79.5, -78.5), ylim = c(34.5, 35.5)) +
theme(strip.background = element_blank(),
strip.text = element_blank(),
axis.title = element_blank(),
plot.background = element_blank(),
legend.position = "none")
})
要定位插图,您需要创建一个 tibble
,其中 x
、y
指示您想要的位置。在这里,我希望它们位于左下角,因此请指定 x = 0.0
和 y = 0
(x
、y
可以是小插图 here 中的 0 - 1
) 并且我希望插图的大小是主图的 50% (vp.width = 0.5, vp.height = 0.5
):
insets_nc_tibble <- tibble(x = rep(0.0, nmax_rep_nc),
y = rep(0.0, nmax_rep_nc),
plot = insets_nc,
timepoint = unique(nc_2$timepoint))
#add inset to plot:
nc_2_main +
geom_rect(xmin = -79.5, xmax = -78.5, ymin = 34.5, ymax = 35.5,
fill = NA, colour = "red", size = 1.5) +
geom_plot_npc(data = insets_nc_tibble,
aes(npcx = x, npcy = y, label = plot,
vp.width = 0.5, vp.height = 0.5))
产生这个情节:
但是左下角的插图不正确 (0, 0)
我想要的。我怎样才能使插图保持这个大小,但移动它使其直接位于角落?
如果我减小插图的大小似乎会有帮助,但这完全是反复试验,我不想减小插图的大小。
#reduce size
nc_2_main +
geom_rect(xmin = -79.5, xmax = -78.5, ymin = 34.5, ymax = 35.5,
fill = NA, colour = "red", size = 1.5) +
geom_plot_npc(data = insets_nc_tibble,
aes(npcx = x, npcy = y, label = plot,
vp.width = 0.5, vp.height = 0.25))
这产生了这个定位更好但不是我想要的正确尺寸的图:
请注意,您也可以通过字符串指定角,但这没有帮助:
#insets_nc_tibble <- tibble(x = rep("left", nmax_rep_nc),
# y = rep("bottom", nmax_rep_nc),
# plot = insets_nc,
# timepoint = unique(nc_2$timepoint))
这个问题是对我之前的回答和其他回答的跟进
我不明白如何改变大小,改变位置。我认为指定 x, y = 0, 0
意味着插图的左下角应该设置为 0, 0
但这里似乎不是这种情况?
有什么想法吗?
谢谢
这看起来像是一个错误。我将调查为什么 x 轴偏移 0.5 度。
这是一个临时解决方法,使用非 noc 版本的 geom 并将 x 坐标移动 -0.5 度:
insets_nc_tibble1 <- tibble(x = rep(-80, nmax_rep_nc),
y = rep(31.5, nmax_rep_nc),
plot = insets_nc,
timepoint = unique(nc_2$timepoint))
#add inset to plot:
nc_2_main +
geom_rect(xmin = -79.5, xmax = -78.5, ymin = 34.5, ymax = 35.5,
fill = NA, colour = "red", size = 1.5) +
geom_plot(data = insets_nc_tibble1,
aes(x = x, y = y, label = plot),
vp.width = 0.5, vp.height = 0.5)
原因是渲染图的网格视口比图本身大。这是 'ggplot2' 中的一个功能还是一个错误很难说,因为 lat 和 lot 否则会被扭曲。可以通过打印ggplot然后运行 grid::showViewport()
看到。这似乎是使用固定坐标的结果,因此插图无法拉伸以填充视口中可用的 space。