Создание мелкомасштабных растровых карт в R Никита Платонов Институт проблем экологии и эволюции им. А.Н.Северцова РАН (ИПЭЭ РАН) Программа изучения белого медведя в Российской Арктике
IDRISI + Visio + визуальная подгонка +... Причина (~2007г.)
Цели Автоматизация построения статических карт Задачи Беглый взгляд на данные независимым вьювером Беглый взгляд на данные независимым вьювером Комплексная компоновка (панель рисунков) Комплексная компоновка (панель рисунков) Подготовка иллюстраций для печати в научных журналах Подготовка иллюстраций для печати в научных журналах
Реализация NCAR Command Language панель – да, слои – да, (x,y)-проекции – ???, кириллица – да?
Реализация QGIS print composer Слои, аннотации, кириллица
РеализацияГИСы Визуальная компоновка, оформление, HiRes экспорт,…
Стандартные средства R # Здесь и далее код не воспроизводимый > str(img.list) List of 3 $ x: num [1:304] $ x: num [1:304] $ y: num [1:448] $ y: num [1:448] $ z: num [1:304, 1:448] NA $ z: num [1:304, 1:448] NA NULL > str(img.data.frame) 'data.frame':67455 obs. of 3 variables: $ x: num $ x: num $ y: num $ y: num $ z: num NA... $ z: num NA...NULL
Стандартные средства R > mycol mycol image(img,asp=1,col=mycol)
Стандартные средства R > filled.contour(img,asp=1,levels=20)
R: Package raster
R: Package lattice > str(coast) num [1:99607, 1:2] NA NULL > str(img) 'data.frame':63082 obs. of 4 variables: $ x: num $ x: num $ y: num $ y: num $ z: num $ z: num $ w: Factor w/ 2 levels "Mar","Sep": $ w: Factor w/ 2 levels "Mar","Sep": NULL
R: Package lattice levelplot(z~x+y|w,data=img,panel = function(...){,panel = function(...){ panel.levelplot(...) panel.levelplot(...) panel.polygon(coast,col="grey65")} panel.polygon(coast,col="grey65")},scales=list(draw=FALSE),xlab="",ylab=""),scales=list(draw=FALSE),xlab="",ylab="")
R: Package ggplot2 ggplot(img,aes(x,y,fill=z))+ geom_raster()+scale_fill_continuous(name="Ice Conc")+ geom_raster()+scale_fill_continuous(name="Ice Conc")+ coord_cartesian(xlim=xlim,ylim=ylim)+facet_grid(.~w)+ coord_cartesian(xlim=xlim,ylim=ylim)+facet_grid(.~w)+ geom_polygon(data=coast,colour="green",fill="#FFFF003F")+ geom_polygon(data=coast,colour="green",fill="#FFFF003F")+ geom_path(data=grid,colour="darkred") geom_path(data=grid,colour="darkred")
Формат экспортируемой карты # > pdf("out1.pdf", width=7, height=7, pointsize=16) > postscript(...) > png("out2.png", width=7, height=7, units=in, res=300,pointsize=16) > tiff(...) #
План разметки # > nc nc nr nr mosaic mosaic mosaic[5,3] mosaic[5,3] mosaic[5,5] mosaic[5,5] mosaic [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,1] [,2] [,3] [,4] [,5] [,6] [,7] [1,] [1,] [2,] [2,] [3,] [3,] [4,] [4,] [5,] [5,] [6,] [6,] [7,] [7,] #
Размеры элементов оформления # Создаем два вектора, отвечающих за размер > s.indent s.indent s.legend s.legend sizec sizec sizer sizer sizec[3] sizec[3] sizer[5] sizer[5] sizec[7] sizec[7] png_width png_width png_height png_height
Размеры элементов оформления # Формируем расположение > nf nf
План разметки # Выбор палитры, задание числа цветов > require(RColorBrewer)
Оформление легенды Выбор палитры Цветовой градиент ( ?colorRamp ) Цветовой градиент ( ?colorRamp ) Фиксированное число панелей Фиксированное число панелей Задание типа экстремумов для отображения Минимальное, максимальное значение Минимальное, максимальное значение Кумулятивные хвосты (%) Кумулятивные хвосты (%) Фиксированный разброс от среднего Фиксированный разброс от среднего Вручную Вручную Отображение легенды
Оформление легенды Подписи легенды Буквенные (категории) Буквенные (категории) Численные (не нужны безобразные дроби) > pretty(x,n=nbar) # Цикл по параметрам с критерием выбора > scale*pretty(x/scale,n=nbar) # Акцентировать ли внимание на НОЛЬ? Численные (не нужны безобразные дроби) > pretty(x,n=nbar) # Цикл по параметрам с критерием выбора > scale*pretty(x/scale,n=nbar) # Акцентировать ли внимание на НОЛЬ? Соответствие значений легенды и изображения Решкалирование изображения к категориям легенды – [minx,maxx) или (minx,maxx] Решкалирование изображения к категориям легенды – [minx,maxx) или (minx,maxx] Ремасштабирование изображения под пространственное разрешение карты Ремасштабирование изображения под пространственное разрешение карты
Вывод растра > par(mar=c(0,0,0,0)) > image(x,...)
Вывод координатной сетки > lines(grid,col=grey45,lty=2)
Вывод береговой линии > polygon(coast,col=transparent) > ?lines
Маскирование суши > polygon(coast) > ?polypath # дырки, но без полутонов/штрих.
Использование градаций серого > polygon(coast,density=15,angle=c(-45,45))
Добавление аннотации > rect(minx,miny,maxx,maxy,col=ann.bg) > text(x0,y0,displayed.text)
Вертикальная легенда > image(x=1,y=bar,z=matrix(bar,nrow=1)) > abline(h=hset,v=NULL); box()
Подписи легенды > mtext(nums,side=4,line=sh.label,...) > mtext(desc,side=4,line=sh.desc,...)
Добавление контура > cl cl sapply(cl,function(x) lines(x))
Растр + контур с легендами > image(imgAir); lines(isoHgt,...) > image(legendAir); image(legendHgt)
Растр + контур + указатели > image(img1); lines(isoheight,...) > arrows(wnd,...)
Наложение полигонов > image(slpImg) > polygon(signif95,density=15,angle=45)
Примеры использования Многопанельные карты
Примеры использования Наслоение кириллицы с помощью ImageMagick
Примеры использования Очистка пустого пространства – внешний софт
Выводы Отображение растра, цветовой легенды – image() Отображение линий – lines(), segments(), contour() Отображение точек – points() Отображение полигонов – polygon(), polypath() Отображение аннотаций – text(), legend() - cлабая поддержка кириллицы - подписи contour() не всегда результативны - неэффективно при множественных подписях TODO-список: Масштабная линейка Указатель на север
Спасибо Никита Платонов (ИПЭЭ РАН)