У меня есть растровые данные, и я хочу сделать контурный график, похожий на этот вопрос введите сюда описание ссылки. Я получил код отсюда. Но я хочу выделить (окрасить) области выше 75 процентиля и остающиеся простыми линиями, показанными на рисунке ниже. Я скопировал код из приведенной выше ссылки
введите описание изображения здесь
Код следующий
library(raster)
library(sf)
library(sp)
r <- raster(t((volcano[,ncol(volcano):1] - 94) * 4.95))
poly <- st_as_sfc(st_bbox(st_as_sf(rasterToPolygons(r))))
set.seed(3456)
sample <- st_sample(poly, 4)
sample <- st_buffer(sample, c(0.01, 0.02, 0.03))
sample <- st_sf(x=1:4, sample)
st_write(sample, "1aa.shp", append = FALSE)
library(raster)
library(sf)
r <- raster(t((volcano[,ncol(volcano):1] - 94) * 4.95))
pg <- st_read("1aa.shp") # loadshapfile
plot(r)
plot(st_geometry(pg), add= TRUE,)
#Теперь работайте с geom_sf() на вашем объекте pg:
centile90 <- quantile(r, 0.90)
df <- as.data.frame(as(r, "SpatialPixelsDataFrame"))
colnames(df) <- c("value", "x", "y")
library(ggplot2)
mybreaks <- seq(0, 500, 50)
ggplot(df, aes(x, y, z = value)) +
geom_contour_filled(breaks = mybreaks) +
geom_contour(breaks = centile90, colour = "pink",
size = 0.5) +
geom_sf(data=pg, fill="black", inherit.aes = FALSE) +
scale_fill_manual(values = hcl.colors(length(mybreaks)-1, "Zissou1", rev = FALSE)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
theme_classic() +
theme()
Я просто хочу сделать изображение, на котором выделена только область, которая выше 75 процентиля по этому коду.
Вы можете установить разрывы geom_contour_filled
так, чтобы они начинались с вашего 75-го центиля, и сделать NA
значение scale_fill_manual
прозрачным. Вам также необходимо нарисовать контурные линии по умолчанию:
centile75 <- quantile(r, 0.75)
ggplot(df, aes(x, y, z = value)) +
geom_contour(color = 'gray') +
geom_contour_filled(breaks = seq(centile70, max(df$value), length = 5)) +
geom_sf(data=pg, fill="black", inherit.aes = FALSE) +
scale_fill_manual(
values = hcl.colors(4, "Zissou1"),
na.value = "#00000000") +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
theme_classic() +
theme()
@MurraySchultz Выражение seq(centile70, max(df$value), length = 5)
создает разрывы. Он генерирует последовательность с равными интервалами от 70-го центиля до максимального значения с 5 элементами. Однако вам не нужно использовать seq
. Вместо этого вы можете использовать c(250, 300, 350, 400, 450, 500)
или любой другой вектор, который вам нравится.
Большое спасибо за полный ответ. Не могли бы вы ответить на мой последний вопрос, как я могу увеличить размер своих графиков (результатов). Окончательное изображение такое короткое (может быть, из этого кода)? Как я могу увеличить размер, потому что при увеличении изображение становится размытым? @ Аллан Кэмерон.
@MurraySchultz, вам просто нужно увеличить окно графика. Если вы перетащите угол окна графика, график увеличится, чтобы заполнить его, поэтому разрешение улучшится. Вы также можете попробовать ggsave
, если хотите вывести изображение в формате png или pdf.
Это действительно работает на моих данных. Можете ли вы сказать мне, как применить разрывы к вышеупомянутому коду, потому что я хочу выбрать конкретный диапазон данных из набора данных. @ Аллан Кэмерон