RGB-композиция графика в R

Есть ли простой способ получить композицию RGB графика в R?

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

[ИЗМЕНИТЬ] коды:

INPUT <- c("3
            0 1 3 3
            2 2 6 4
            1 0 3 5")

require(png)

 # This is the pixel precision, 1e4 recommended for optimal results
PRECISION <- 1e4  

 # Just parsing the initial input and the vectors
sdata <- strsplit(gsub("\n", " ", INPUT), split=c(" "))[[1]] 
data  <- as.numeric(sdata)

 # Some usefull matrices for the plot points
Rm  <- matrix(data[-1], data[1],4,T)
Rmx <- cbind(Rm[,c(1,1)], Rm[,c(3,3)], Rm[,1])
Rmy <- cbind(Rm[,c(2,4)], Rm[,c(4,2)], Rm[,2])
 # and for the overall big rectangle
B  <- c(min(Rm[,1]), min(Rm[,2]), max(Rm[,3]), max(Rm[,4]))
Bx <- c(B[c(1,1)],B[c(3,3)],B[1])
By <- c(B[c(2,4)],B[c(4,2)],B[2])
A  <- B[3:4]-B[1:2]

 # Biggest number of digits given, not perfect but it works
D <- max(nchar(gsub("(.*\\.)|([0]*$)", "", sdata[-1])))

 # Create the plot and save it in the working directory, 
 #  then read it back to get the RGB information
png("rgb1.png", bg="black", width=PRECISION, height=PRECISION)
plot(x=Rmx, y=Rmy,'n', xaxt='n', yaxt='n', xlab="", ylab="", bty='n', 
     xlim=B[c(1,3)], ylim=B[c(2,4)])
polygon(Bx, By, col="blue", border=NA)
sapply(1:nrow(Rm), function(v){ polygon(Rmx[v,], Rmy[v,], 
                                        col="red", border=NA)})
dev.off()
plot.rgb <- readPNG("rgb1.png")

 # Compute area
Re <- sum(plot.rgb[,,1])
Bl <- sum(plot.rgb[,,3])
round( (Re/(Bl+Re))*prod(A), digits=D+1 )

person Pane    schedule 20.04.2014    source источник
comment
Возможно, углубимся в R Internals для графики. устройств было бы неплохо начать вместе с знакомство с графическими устройствами.   -  person hrbrmstr    schedule 20.04.2014
comment
См. grid.cap(), чтобы захватить содержимое текущего графического устройства, col2rgb(), чтобы преобразовать цвета в компоненты R, G и B, array() и aperm(), чтобы получить их в нужном формате (который вы не указали). Это могло бы по крайней мере заставить вас начать.   -  person Josh O'Brien    schedule 20.04.2014
comment
Какой сюжет вы создаете? Получение цвета из диаграммы рассеивания сильно отличается, например, от получения цветов растрового изображения.   -  person Carl Witthoft    schedule 20.04.2014
comment
Джош, я посмотрю на это, прямо сейчас, когда я использую grid.cap() с Rstudio, он всегда возвращает NULL. У меня была эта проблема раньше во время моих стычек с grid-cap, и мне нужно вспомнить, в чем была проблема.   -  person Pane    schedule 20.04.2014
comment
Карл, я добавил код. Это мое решение задачи по программированию на популярном веб-сайте. Вы можете видеть, что я заполняю график цветом, чтобы вычислить общую площадь пересекающихся прямоугольников, определенных в INPUT. Это работает почти идеально при экспорте png с большим количеством пикселей (1e4), но цифры все еще немного не совпадают. Например, точная область в приведенном выше вводе — 18, а я получаю 18.00054, облом. Во всяком случае, я думал, что проблема может быть при экспорте в png, и, возможно, решение заключалось в том, чтобы получить более точное представление пикселей.   -  person Pane    schedule 20.04.2014
comment
может быть, отключить псевдоним для этой ошибки округления?   -  person baptiste    schedule 20.04.2014
comment
baptise, я пробовал параметры сглаживания, меняя тип, но безрезультатно.   -  person Pane    schedule 20.04.2014
comment
Хорошо, а затем вернемся к тому, что я должен был спросить: какую проблему вы пытаетесь решить? Могут быть более простые или быстрые способы получить актуальную информацию, которая вам нужна.   -  person Carl Witthoft    schedule 20.04.2014
comment
Извините, если я путаю. Основная проблема, учитывая R-график, состоит в том, чтобы определить процент графика, отображаемый в заданном цвете. В моем примере это график, и с помощью метода png я обнаружил, что красный цвет представляет 60,00182% участка. Я подозревал, что может быть более простой и, возможно, более точный способ получить этот процент, чем запись/чтение внешнего png.   -  person Pane    schedule 20.04.2014
comment
В общем, как этот вопрос и мой ответ на него, за исключением того, что RStudio калечит вашу способность использовать преимущества или полную функциональность R;)   -  person Josh O'Brien    schedule 21.04.2014
comment
Кажется, это именно то, что я искал. Определенно не работает в Rstudio даже с options(device="windows"). Думаю, я попробую на Emacs. Спасибо   -  person Pane    schedule 21.04.2014
comment
Прохладно. Рад, что похоже, что он выполняет то, что вам нужно. Я пользователь Emacs и могу подтвердить, что он вам там подойдет.   -  person Josh O'Brien    schedule 21.04.2014