Как сделать график контурных линий, который окрашивал бы только определенную область?

У меня есть растровые данные, и я хочу сделать контурный график, похожий на этот вопрос введите сюда описание ссылки. Я получил код отсюда. Но я хочу выделить (окрасить) области выше 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 процентиля по этому коду.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете установить разрывы 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()

enter image description here

Это действительно работает на моих данных. Можете ли вы сказать мне, как применить разрывы к вышеупомянутому коду, потому что я хочу выбрать конкретный диапазон данных из набора данных. @ Аллан Кэмерон

Murray Schultz 09.04.2022 18:34

@MurraySchultz Выражение seq(centile70, max(df$value), length = 5) создает разрывы. Он генерирует последовательность с равными интервалами от 70-го центиля до максимального значения с 5 элементами. Однако вам не нужно использовать seq. Вместо этого вы можете использовать c(250, 300, 350, 400, 450, 500) или любой другой вектор, который вам нравится.

Allan Cameron 09.04.2022 18:41

Большое спасибо за полный ответ. Не могли бы вы ответить на мой последний вопрос, как я могу увеличить размер своих графиков (результатов). Окончательное изображение такое короткое (может быть, из этого кода)? Как я могу увеличить размер, потому что при увеличении изображение становится размытым? @ Аллан Кэмерон.

Murray Schultz 09.04.2022 19:05

@MurraySchultz, вам просто нужно увеличить окно графика. Если вы перетащите угол окна графика, график увеличится, чтобы заполнить его, поэтому разрешение улучшится. Вы также можете попробовать ggsave, если хотите вывести изображение в формате png или pdf.

Allan Cameron 09.04.2022 19:07

Другие вопросы по теме