Создание растрового графика в R

Я пытаюсь создать растровый график (например, диаграмму Ховмоллера) и надеялся, что кто-то может помочь. Я просмотрел справку с помощью rasterVis и некоторых других, но, похоже, не могу найти их примеры, соответствующие моим данным, которые, вероятно, нуждаются в некотором преобразовании, которое ускользает от меня. Мне удалось создать график, но значения заливки ячеек не соответствуют исходным данным. Я скопировал файл dput () с примером моего фрейма данных (надеюсь, это правильный способ сделать это). Мне нужны дни года (DOY) по оси x с осью y из 48 прямоугольников (столбец часов в DF) над каждым DOY. Эти прямоугольники будут представлять получасовые интервалы для каждого DOY и будут раскрашены в соответствии с их соответствующим значением (столбец qc в DF), которое равно 0,1 или 2.

Пока что я придумал следующий код, но, похоже, проблема с выделением значения z (столбец qc) для цвета, я думаю, что значения по какой-то причине не выстраиваются должным образом ...

mcol <- c("green","blue","red")
x=unique(DF[,"DOY"])
y=unique(DF[,"hour"])
z=matrix(DF[,"qc"],nrow=length(unique(DF[,"DOY"])),
                     ncol=length(unique(DF[,"hour"])))
image(x,y,z, col=mcol,
  xlab="Day of Year 2012", 
  ylab="Hour of day",
  main="Hovmoller plot of 2012 qc flags",
useRaster=TRUE)

Кажется, что происходит то, что матрица значений заполнения (z) применяется сначала вдоль нижней части оси x (слева направо), а затем зацикливается наверху, тогда как мне нужно, чтобы она начиналась в нижнем левом углу и поднималась вверх затем зацикливайтесь слева направо (надеюсь, что это имеет какой-то смысл!) В моем примере данные охватывают только три дня, но полный набор данных будет за целый год (366 в 2012 году). Заранее благодарю за любую помощь,

Джон

structure(list(DOY = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L), hour = c(0.5, 1, 1.5, 2, 2.5, 3, 3.5, 
4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 
11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 
18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24, 
0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 
8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 
15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 
21.5, 22, 22.5, 23, 23.5, 24, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 
4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 
12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 
18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24), 
    qc = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 1L, 2L, 1L, 1L, 2L, 2L, 0L, 0L, 1L, 0L, 2L, 2L, 2L, 2L, 
    2L, 2L, 0L, 2L, 2L, 0L, 0L, 1L, 2L, 0L, 2L, 0L, 1L, 2L, 1L, 
    2L, 2L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 0L, 0L, 
    2L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L)), .Names = c("DOY", 
"hour", "qc"), class = "data.frame", row.names = c(NA, -144L))

person JonP    schedule 03.03.2013    source источник
comment
Что-то вроде library(raster);plot(raster(t(z)))?   -  person Roman Luštrik    schedule 03.03.2013


Ответы (3)


Закрывать! Попробуйте что-то вроде этого (x и y генерируются вашим кодом выше):

library( sp )
r <- raster(nrows=length(y), ncols=length(x), xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y))
values(r) <- t(DF$qc)
spplot( r , cuts = 2 )

spplot из пакета sp использует решетчатую графику и легко настраивается в соответствии с вашими потребностями.

введите описание изображения здесь

Хорошо, geom_tile может быть лучшим выбором (пока количество ячеек растра не станет большим), если вы хотите иметь возможность различать разные ячейки:

p <-    ggplot( DF , aes(factor(DOY), hour ) ) + 
    geom_tile( aes(fill = factor(qc) ) , color = "#D9D9D9" ) + 
    scale_fill_brewer(name="QC", type = "div" , palette = "RdBu" )+
    scale_x_discrete( name = "Day" , expand = c(0,0) ) +
    scale_y_continuous( name = "Hour" , limits = c(0.5,24) , expand = c(0,0) , breaks = seq(0,24,2) )+
    coord_equal()
print(p)

введите описание изображения здесь

person Simon O'Hanlon    schedule 03.03.2013
comment
Спасибо за ответы, но возникла та же проблема с несовпадением значений qc с ячейками. В качестве теста, если вы измените все значения qc, соответствующие DOY4, на 1, тогда в левой части графика должна появиться вертикальная белая линия от ymin до ymax, этого не произойдет. Почему-то матрица для значений z не работает в правильном направлении. - person JonP; 03.03.2013
comment
Спасибо, Саймон, да, я действительно хотел различать отдельные ячейки, чтобы ваше решение было идеальным, большое спасибо. - person JonP; 03.03.2013
comment
@JonP Хорошо, отлично! Теперь вы должны отметить зеленую стрелку рядом с вашим или моим ответом, чтобы указать, что это ответ на ваш вопрос. - person Simon O'Hanlon; 03.03.2013

Хорошо, теперь это сработало, и довольно просто ...

library(ggplot2)
ggplot(DF,aes(DOY,hour,fill=qc))+geom_raster()

Извините, это было проще, чем я предполагал. Я бы предпочел, чтобы цвета легенды были дискретными, а не непрерывными, но это второстепенная деталь. Спасибо за ваш вклад. Джон

person JonP    schedule 03.03.2013
comment
++ за то, что был одновременно общительным и информативным в этой теме. Надеюсь увидеть больше вас в R-сообществе. - person Carl Witthoft; 03.03.2013

Функция hovmoller из пакета rasterVis предназначена для данных 4D (координаты, числовая переменная и временной индекс). Однако, если я не ошибаюсь, вам нужно построить одномерный временной ряд, используя график уровня.

Здесь я показываю пример с lattice::levelplot.

Сначала мы определяем данные с помощью временного индекса:

tt <- seq(as.POSIXct('2013-01-01'), by='hour', length=8760)
vals <- 1:24 - 12.5
myDF <- data.frame(vals, tt)

Затем мы определяем две вспомогательные функции для извлечения часа и дня года из временного индекса:

hour <- function(x)as.numeric(format(x, '%H'))
DoY <- function(x)as.numeric(format(x, '%j'))

Затем мы загружаем пакеты и определяем тему с последовательной палитрой из пакета RColorBrewer:

library(lattice)
library(latticeExtra)
myTheme <- custom.theme(region=brewer.pal(n=10, 'RdBu'))

И наконец, мы готовы отображать данные:

levelplot(vals ~ DoY(tt)*hour(tt),
          data=myDF,
          xlab='Day', ylab='Hour',
          par.settings=myTheme)

levelplot result

Для более полного решения вас может заинтересовать strip функция metvurst пакет.

person Oscar Perpiñán    schedule 07.03.2013