Как обозначить растр, используя непосредственно таблицу атрибутов растра и отображая условные обозначения только для класса, отображаемого в растре?

Я хотел бы использовать информацию таблицы атрибутов растра для создания легенды растра, такого как растр 1, и отображения легенды только для класса, отображаемого в растре. Я строю пример, чтобы объяснить, что я хотел бы получить.

1 / Построить растр

r <- raster(ncol=10, nrow=10)
values(r) <-sample(1:3,ncell(r),replace=T)

2/ Добавьте таблицу атрибутов растра

r <- ratify(r) # build the Raster Attibute table
rat <- levels(r)[[1]]#get the values of the unique cell frot the attribute table
rat$legend <- c('Class A', 'Class B', 'Class C')
levels(r) <- rat

3/ График растров Рис 1

my_col=c('blue','red','green')
plot(r,col=my_col,legend=F,box=F,axes=F)
legend(x='top', legend =rat$legend,fill = my_col)

Я хотел бы заменить legend =rat$legend Параметр с помощью свойств растра, связанного с таблицей атрибутов ratser. Я пробовал разные комбинации, используя levels() такие как c(levels(r)[[1]][1]) но я создаю список, а не символ, который нельзя использовать в параметре легенды.

4 / Обрезать и нанести растр на участок только с 2 классами (здесь 4 пикселя справа внизу) Рис. 2

rcrop<-crop(r,extent(r,9,10,9,10))
plot(rcrop,col=my_col,legend=F,box=F,axes=F)

Таким образом, для второго рисунка я хотел бы автоматически отобразить только легенду о классе, отображаемую в растре 2.

Растр с легендой

Обрезанный растр с легендой


Вот решение, предложенное Романом 4. Решение, предложенное Романом

3 ответа

Решение

Если вы готовы использовать lattice графика, levelplot метод, определенный в rasterVis Пакет способен отображать категориальные данные с легендой на основе RAT:

library(raster)
library(rasterVis)

r <- raster(ncol=10, nrow=10)
values(r) <- rep(1:4, each=25)

r <- ratify(r) 
rat <- levels(r)[[1]]
rat$legend <- c('Class A', 'Class B', 'Class C', 'Class D')
levels(r) <- rat

levelplot(r)

rat.png

Кроме того, я внес некоторые изменения в версию для разработчиков, доступную на GitHub, для управления Raster* чьи уровни RAT не все присутствуют в данных:

rcrop <- crop(r,extent(r,6,10,1,10))
levelplot(rcrop)

крыса

rcrop <- crop(r,extent(r,1,5,1,10))
levelplot(rcrop)

крысиный урожай2

Может быть, запрос rcrop растр, чтобы узнать, какие уровни есть в обрезанном растре, и передать его легенде?

legend(x = 'top', legend = unique(getValues(rcrop)), fill = my_col)

Благодарю. На основании того, что вы предложили, я нашел решение:

plot(rcrop,col=my_col[unique(getValues(rcrop))],legend=F,box=F,axes=F)
legend_full<-data.frame(levels(rcrop))
legend(x='top', legend =as.character(unlist(legend_full[unique(getValues(rcrop)),2])),fill = my_col[unique(getValues(rcrop))])

Это работает и позволяет быть независимым от значений, отображаемых в растре.

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