У меня есть регион, разделенный по долготе и широте. Я знаю, что расстояние в 1 градус широты составляет 111 320 м, а расстояние в 1 градус долготы зависит от широты. Размер моей сетки 25х25м, а сетка, показанная на рисунке (всего 600 сеток), слишком велика (см. рисунок ниже), что нереально.
Мой код следующий:
library(ggplot2)
library(dplyr)
library(readr)
color_breaks <- c(0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0)
colors <- c("#E31A1C", "#FF7F00", "#FDBF6F", "#E9E4A6", "#A4D4A9", "#B2DF8A", "#33A02C", "#1F78B4")
p1 <- ggplot(merged_data, aes(x = longitude, y = latitude, z = median_mafruit)) +
labs(
title = "Data1",
subtitle = "10 years",
x = "Longitude (°)",
y = "Latitude (°)",
fill = expression("Amount")
) +
theme_minimal()
p1<-p1 +
stat_summary_2d(
aes(fill = after_stat(
cut(
value,
breaks = c(0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0),
include.lowest = TRUE,
right = FALSE
)
)),
bins = 30,
show.legend = TRUE
) +
scale_fill_manual(
values = colors,
drop = FALSE,
guide = guide_legend(reverse = TRUE)
) +
theme(
plot.title = element_text(size = 14, face = "bold"),
plot.subtitle = element_text(size = 12, face = "italic"),
legend.title = element_text(size = 10),
legend.text = element_text(size = 8),
legend.key.size = unit(0.5, "cm"),
legend.spacing.x = unit(0.5, "cm"),
legend.spacing.y = unit(0.5, "cm")
)
p1
Часть моего набора данных показана ниже:
structure(list(Order = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20), latitude = c(43.2143, 43.3697,
43.3909, 43.3926, 43.3961, 43.3978, 43.066, 43.2215, 43.368,
43.435, 43.4434, 43.4623, 43.4895, 43.4856, 43.3738, 43.4761,
43.5102, 43.5118, 43.5062, 43.4933), longitude = c(-4.479, -4.4804,
-4.4606, -4.4484, -4.4241, -4.412, -4.1046, -4.1049, -4.1031,
-4.0818, -4.021, -3.9502, -3.8184, -3.7798, -3.7279, -3.7147,
-3.5971, -3.5849, -3.5585, -3.5177), median_mafruit = c(2.73,
1.095, 1.115, 2.73, 0.527, 0.527, 0.962, 1.039, 1.039, 2.73,
2.73, 2.73, 2.73, 2.73, 0.544, 2.73, 2.73, 2.73, 0.478, 2.73)), row.names = c(NA,
-20L), spec = structure(list(cols = list(Order = structure(list(), class = c("collector_double",
"collector")), latitude = structure(list(), class = c("collector_double",
"collector")), longitude = structure(list(), class = c("collector_double",
"collector")), median_mafruit = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), delim = ","), class = "col_spec"), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))
Я хочу сохранить соответствующие промежутки между сетками, а длины горизонтальных и вертикальных координат изображения должны больше соответствовать фактической пропорции (в настоящее время 2 широты соответствуют 5 долготам, что непрактично).
Кажется, эта проблема лучше подходит для одного из пакетов географических информационных систем, доступных в R. Если вы отображаете свои данные с использованием географического пакета, система координат и/или проекция решают именно эту проблему. Были бы вы открыты для такого решения?
Да. Не могли бы вы порекомендовать мне один географический пакет? @Шон Маккензи
Вы можете использовать coord_sf()
, который, помимо прочего, интерпретирует координаты относительно географической или проекционной системы координат. В вашем примере я предположил, что ваши координаты — WGS84/EPSG:4326. Если они находятся в другой системе координат, вы можете найти соответствующий код EPSG в Интернете, а затем заменить 4326 правильным кодом.
Если вы собираетесь использовать ggplot2
для построения пространственных данных в будущем, я рекомендую вам изучить пакеты sf
и terra
. Для объектов научной фантастики вы можете использовать geom_sf()
, который «интуитивно» обрабатывает координаты и т. д. Для объектов SpatRaster вам понадобится пакет tidyterra
для использования geom_spatraster()
.
library(ggplot2)
library(dplyr)
p1 <- ggplot(merged_data, aes(x = longitude, y = latitude, z = median_mafruit)) +
labs(
title = "Data1",
subtitle = "10 years",
x = "Longitude (°)",
y = "Latitude (°)",
fill = expression("Amount")
) +
theme_minimal()
p1<-p1 +
stat_summary_2d(
aes(fill = after_stat(
cut(
value,
breaks = c(0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0),
include.lowest = TRUE,
right = FALSE
)
)),
bins = 30,
show.legend = TRUE
) +
scale_fill_manual(
values = colors,
drop = FALSE,
guide = guide_legend(reverse = TRUE)
) +
coord_sf(datum = 4326
) +
theme(
plot.title = element_text(size = 14, face = "bold"),
plot.subtitle = element_text(size = 12, face = "italic"),
legend.title = element_text(size = 10),
legend.text = element_text(size = 8),
legend.key.size = unit(0.5, "cm"),
legend.spacing.x = unit(0.5, "cm"),
legend.spacing.y = unit(0.5, "cm")
)
p1
Если приближение достаточно хорошее для ваших целей, вы можете установить соотношение сторон 1:1, например
ggplot(...) + ... + coord_fixed()
.