Манипулирование подразделами массива - PullRequest
0 голосов
/ 15 сентября 2011

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

Я разработал следующие шаги:

x<-array(1,dim=c(4,4,3))
r<-x[,,1]
g<-x[,,2]
b<-x[,,3]

r1<-apply(r[,2:3],1:2,function(f){return(0)})
g1<-apply(g[,2:3],1:2,function(f){return(0)})
b1<-apply(b[,2:3],1:2,function(f){return(0)})

r3<-cbind(r[,1],r1,r[,4])
g3<-cbind(g[,1],g1,g[,4])
b3<-cbind(b[,1],b1,b[,4])

# Pass to pixmapRGB

Это работает, но, поскольку я новичок в R, мне было интересно, если был более эффективный способ манипулирования частями массива.

Например, приложение знает, над каким элементом он работает?

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

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

Существует много данных, поэтому невозможно перерисовать новый участок для миниатюры на каждой странице.

Что я сделал, так это сначала записал эскиз в файл формата TIFF. Затем я прочитал TIFF файл обратно, использовал getChannels из pixmap разбить картинку на массивы и использовать приведенный выше код для изменения некоторые пиксели основаны на столбце. Наконец, я затем печатаю изображение в окне просмотра, используя pixmapRGB / pixmapGrob / grid.draw

Кажется, много шагов. Буду благодарен за любые указатели это помогло бы мне сделать это более эффективным.

Ответы [ 3 ]

3 голосов
/ 15 сентября 2011

Может быть, я не понимаю ваш вопрос, но если вы пытаетесь просто «изменить несколько пикселей на основе столбца», почему бы вам просто не использовать базовую индексацию массива для этого?

Это сделает то же самое, что и вы:

x<-array(1,dim=c(4,4,3))
r<-x[,,1]
g<-x[,,2]
b<-x[,,3]
r[,2:3]=0
g[,2:3]=0
b[,2:3]=0

Это полезно?

1 голос
/ 15 сентября 2011

Возможно, это скорее комментарий, чем ответ, но когда я пытаюсь построить несколько страниц, я обычно иду слева направо, разбивая графики на квантили и устанавливая соответствующие xlim (или ylim)

x <- rnorm(100000)
y <- rnorm(100000)
df <- data.frame(x,y)
seq1 <- quantile(df$x, probs = seq(0,1,0.1))
seq2 <- quantile(df$x, probs = seq(0,1,0.1))

for(x in 1:(length(seq1)-1)) { 
  plot(df, xlim=c(seq1[x],seq1[x+1]))
}

Не знаю, как наложить миниатюру на графики, хотя я думаю, что вы могли бы сделать это с помощью одной из rimage функций, если сохранили миниатюру.

0 голосов
/ 15 сентября 2011

Вы могли бы избежать необходимости читать и вставлять миниатюру tiff, фактически выкладывая график целиком в уменьшенном масштабе. проверить par(fig), а затем сделать что-то вроде

Rgames: plot(1:2,1:2)

Rgames: par(mar=c(.1,6,.1,.1),new=T,fig=c(0,.25,.5,.75))

Rgames: plot(1:2,1:2)

Rgames: polygon(c(1,2,2,1),c(1,1,2,2),col='red')

("Rgames:" - моя подсказка) Вам придется немного поиграть со значениями полей, но это настроит ваш «мини-график».

...