Пытаюсь создать карту со схемой Вороного некоторых климатических станций. Я уже создал диаграмму и раскрасил ее области подходящим цветом. Теперь мне нужна непрерывная легенда, которая расскажет мне, что означают цвета в этих областях.
Вот что уже работает:
library(terra)
f <- system.file("ex/lux.shp", package = "terra")
e <- vect(f)
x <- centroids(e)
v <- voronoi(x, e)
v <- terra::crop(v, e)
FUN <- colorRamp(c("black", "lightgrey"))
vpop <- (v$POP - min(v$POP)) / diff(range(v$POP))
vcols <- rgb(FUN(vpop), maxColorValue = 256)
plot(v, lwd = 2, col = vcols,
main = "Voronoi Diagram",
background = "beige"
)
points(x, col = "red")
Мне нужна легенда с правой или нижней стороны графика, которая сопоставляет численность населения территорий с используемыми там цветами. Поскольку исходные данные содержат 50 точек, мне нужна непрерывная легенда. Это то, что я пробовал:
l <- c(5.8, 6.4, 49.35, 49.38)
plot(v, lwd = 2, col = vcols,
main = "Voronoi Diagram",
background = "beige",
type = "continuous",
range = c(min(v$POP, max(v$POP)))
plg = list(
ext = l,
loc = "bottom",
title = "Population"
)
)
points(x, col = "red")
Я также пробовал переместить type
и range
в список аргумента plg
, но это тоже не дало результата.
Я также пробовал использовать функцию add_legend
из terra.
add_legend("right",
legend = c(min(v$POP), max(v$POP)),
col = vcols)
Это также приводит к тому, что на карте плавают только два числа.
@Chris Спасибо за признание, это действительно впечатляет. На самом деле я обнаружил ошибку во время редактирования моего вопроса при переполнении стека и забыл обновить графику. Так что ошибка моя. Я отредактирую пост и выложу правильный сюжет.
Может быть, что-то вроде этого:
library(terra)
f <- system.file("ex/lux.shp", package = "terra")
e <- vect(f)
x <- centroids(e)
v <- voronoi(x, e)
v <- terra::crop(v, e)
r <- rast(v, ncols=6000, nrows=8000)
z <- rasterize(v, r, field = "POP")
FUN <- colorRamp(c("black", "lightgrey"))
vpop <- (v$POP - min(v$POP)) / diff(range(v$POP))
vcols <- rgb(FUN(vpop), maxColorValue = 256)
vcols_sorted <- rgb(FUN(sort(vpop)), maxColorValue = 256)
layout(matrix(1:2, nrow=2), width = c(1,1), height = c(5,1))
plot(v, lwd = 2, col = vcols,
main = "Voronoi Diagram",
background = "beige"
)
points(x, col = "red")
legend_image <- as.raster(matrix(vcols_sorted, nrow=1))
plot(c(0,0.5), c(0,0.5), type = 'n',
axes = F, xlab = '', ylab = '', main = 'Population')
text(y=-1.2, x = seq(0.15, 0.35, l =3),
labels = c("5,000", "95,000", "185,000"))
rasterImage(legend_image, 0.15, 0, 0.35, 1.5)
Подробнее см. в этом вопросе: Легенда градиента в базе
Вам просто нужно добавить имя атрибута, который вы хотите отобразить, в качестве аргумента y
к plot
и установить type = "continuous"
.
# Need to order the values to get the color ramp in the correct order.
vpop <- vpop[order(vpop)]
vcols <- rgb(FUN(vpop), maxColorValue = 256)
plot(v,
"POP",
lwd = 2,
type = "continuous",
col = vcols,
main = "Voronoi Diagram",
background = "beige",
)
points(x, col = "red")
Это не имеет отношения к замечательному ответу ниже, но вы можете вернуться к построению аномалий, которые могут расстроить. Второстепенный и случайный, но основной = «Диаграмма Вороного» становится «Диаграммой Вороного» при построении графика. Царапина на голове.
capabilities()
сообщит вам, к каким графическим устройствам у вас есть доступ и их характеристики, скажемX11.options()
. Этот вопрос побудил меня наконец переключиться.Rprofile
с Xlib на cairo. Это может быть неприменимо в зависимости от вашей ОС, но у вас есть индикатор дальнейших проблем.