Я пытаюсь удалить белые границы вокруг фасетного участка, который я создал с помощью geom_sf()
. Раньше я использовал устаревший пакет rgdal
и coord_cartesian()
. Я пытаюсь построить аналогичный график, используя geom_sf()
и coord_sf()
, но, похоже, не могу заставить его работать.
Мой код:
land <- sf::read_sf("./shapefiles/Grey_WA_OR.shp")
land <- sf::st_transform(land, crs = "+proj=longlat +datum=WGS84")
water <- sf::read_sf("./shapefiles/NW_Marine.shp")
water <- sf::st_transform(water, crs = "+proj=longlat +datum=WGS84")
heatmap <- ggplot()+ theme_bw()+
geom_sf(data = water, fill = "paleturquoise3", color = "turquoise4") +
geom_sf(data = land, fill='grey96') +
coord_sf(xlim = c(-126.3, -122.3), ylim = c(48.3, 50.39)) +
geom_point(data= CPUE.bymonth.mean.nonzero, mapping = aes(x=Lon, y=Lat,
size=MeanCPUE), alpha = 0.5, colour= "coral", stroke = 0.7)+
geom_point(data = CPUE.bymonth.mean.zeros, mapping = aes(x = Lon, y = Lat,
size = MeanCPUE), alpha = 0.7, color = "gray25") +
scale_size_continuous(breaks = c(0, 500,1000, 3000), name = "Mean CPUE",
range = c(2.5,15)) +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())+
guides(size = guide_legend(override.aes = list(color =
c("gray25","coral","coral", "coral"), alpha = 0.6), size = 12))+
facet_grid(Year ~ Month)+
theme(
strip.text.x = element_text(size = 12, color = "black", face = "bold"),
strip.text.y = element_text(size = 12, color = "black", face = "bold"))
ggsave(filename = "figures/CPUE_map.png", plot = heatmap,
width = 12, height = 6, dpi = 600 )
Что я получаю:
Что я надеюсь получить:
Я просмотрел пакет Cowplot, но, к сожалению, не смог заставить его работать, не уверен, содержит ли этот пакет решение? Я также пробовал удалить поля с помощью theme(plot.margin = unit(c(0,0,0,0), "cm"))
, но безуспешно.
Проблема заключается в том, что вы сохраняете ту же ширину и высоту вашего первого ggsave()
вывода, даже если вы спроецировали свои данные в WGS84/EPSG:4326. Обратите внимание, что остров Ванкувер на первом изображении гораздо более вытянут по сравнению со вторым. Это потому, что coord_sf()
автоматически отображает данные в относительных координатах научно-фантастического объекта. При использовании coord_cartesian()
значения x и y считаются равными. Если вам нужно заполнить область графика, у вас есть три варианта:
coord_sf()
и просто отрегулируйте значения ширины и высоты в ggave()
.coord_sf()
, пока выходные данные не будут соответствовать существующим значениям ширины и высоты.geom_polygon()
в сочетании с coord_fixed()
.Этот упрощенный репрекс демонстрирует варианты 1 и 3, последний, я считаю, вам нужен. Поскольку вы не предоставили никаких образцов данных, я использовал набор данных ne_countries()
из пакета rnaturalearth
вместо слова «земля». Для простоты я создал только точки выборки, представляющие «CPUE.bymonth.mean.nonzero», и использовал panel.background =
вместо «воды».
Опция 1
library(rnaturalearth)
library(sf)
library(dplyr)
library(ggplot2)
# Load world map data
land <- ne_countries(scale = "medium")
# Create sample point data
set.seed(1)
CPUE.bymonth.mean.nonzero <- data.frame(Lon = runif (10, -126, -124),
Lat = runif (10, 48.5, 49.5),
Year = rep(c(2022, 2023), each = 5),
Month = rep(month.abb[4:8], 2),
MeanCPUE = sample(100:4000, 10))
# Plot
heatmap <- ggplot() +
geom_sf(data = land) +
geom_point(data= CPUE.bymonth.mean.nonzero,
aes(x = Lon, y = Lat, size = MeanCPUE),
alpha = 0.5,
colour = "coral",
stroke = 0.7) +
coord_sf(xlim = c(-126.2986, -122.2988),
ylim = c(48.30015, 50.39008)) +
scale_size_continuous(breaks = c(0, 500,1000, 3000),
name = "Mean CPUE",
range = c(2.5, 15)) +
theme_bw() +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.background = element_rect(fill = "paleturquoise3", colour = NA),
legend.key = element_rect(fill = "white", colour = NA),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
guides(size = guide_legend(override.aes = list(color = c("coral", "coral", "coral"),
alpha = 0.6), size = 12)) +
facet_grid(Year ~ Month) +
theme(strip.text.x = element_text(size = 12, color = "black", face = "bold"),
strip.text.y = element_text(size = 12, color = "black", face = "bold"))
ggsave("figures/CPUE_map.png",
heatmap,
width = 12,
height = 3.8,
dpi = 600)
Вот результат, обратите внимание, что разрешение этого изображения составляет всего 150 точек на дюйм:
Вариант 3
В этом примере я использовал coord_fixed(ratio = 2.5)
, что, похоже, очень похоже на ваш исходный сюжет. При необходимости отрегулируйте.
# Convert land sf to df
land_df <- land |>
select(geometry) |>
st_cast("POLYGON") |>
st_coordinates() |>
as.data.frame() |>
rename(lon = X, lat = Y)
# Plot
heatmap <- ggplot() +
geom_polygon(data = land_df,
aes(x = lon, y = lat, group = L2),
fill = "grey96",
colour = "turquoise4") +
geom_point(data= CPUE.bymonth.mean.nonzero,
aes(x = Lon, y = Lat, size = MeanCPUE),
alpha = 0.5,
colour = "coral",
stroke = 0.7) +
coord_fixed(xlim = c(-126.2986, -122.2988),
ylim = c(48.30015, 50.39008),
ratio = 2.5) +
scale_size_continuous(breaks = c(0, 500,1000, 3000),
name = "Mean CPUE",
range = c(2.5, 15)) +
theme_bw() +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.background = element_rect(fill = "paleturquoise3", colour = NA),
legend.key = element_rect(fill = "white", colour = NA),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
guides(size = guide_legend(override.aes = list(color = c("coral", "coral", "coral"),
alpha = 0.6), size = 12)) +
facet_grid(Year ~ Month) +
theme(strip.text.x = element_text(size = 12, color = "black", face = "bold"),
strip.text.y = element_text(size = 12, color = "black", face = "bold"))
ggsave("figures/CPUE_map.png",
heatmap,
width = 12,
height = 6,
dpi = 600)
Опять же, этот пример построен с разрешением 150 точек на дюйм, но значения ширины и высоты в ggsave()
соответствуют исходному графику.
Я напутал с редактированием своего комментария, прошу прощения. Когда я изначально создавал графики с помощью rgdal/coord_cartesian, я использовал WGS84, поэтому, думаю, я бы предпочел продолжать использовать этот CRS. Я посмотрю geom_polygon()
, спасибо за предложение!
@L Тайрон, это потрясающе и именно то, что я искал, большое спасибо!
Спасибо за ваш комментарий - очень полезно, и мои извинения за то, что не предоставил повторения. Регулируя xlim/ylim, я действительно могу уменьшить/удалить белую рамку вокруг графика фасетной сетки, хотя, наверное, я надеялся, что смогу сохранить тот же xlim/ylim и «удлинить» графики (сохраняя при этом те же параметры). CRS), возможно, изменить соотношение сторон? Будет ли это желательно при построении карт? редактировать: я понимаю, что могу изменить соотношение сохраненного файла .png, но это также влияет на легенду. Просто пытаюсь понять, есть ли обходной путь.