Как обозначить растр, используя непосредственно таблицу атрибутов растра и отображая условные обозначения только для класса, отображаемого в растре?
Я хотел бы использовать информацию таблицы атрибутов растра для создания легенды растра, такого как растр 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)
Кроме того, я внес некоторые изменения в версию для разработчиков, доступную на 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)
Может быть, запрос 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))])
Это работает и позволяет быть независимым от значений, отображаемых в растре.