2015-07-06 8 views
4

У меня есть фрейм данных с такими факторами, как это:Преобразования каждого столбца матрицы на подматрицу и проходной каждую подматрицу для построения

rss<-c("rs","total","rs","total","total","total","rs","rs") 
css<-c("G","S","S","Q","Q","Q","G","G") 
batch<-c("5","6","6","7","7","8","7","5") 
dat<-data.frame(rss,css,batch) 

Я хочу построить числовую матрицу выше кадра данных для каждого столбца, т. е. преобразовать матрицу 8 * 3 в 3,4 * 2 подматрицы по столбцу. Таким образом, я могу выполнить цикл и построить данные подматрицы.

newdat<-data.matrix(dat) 
split.dat<-split(newdat,col(newdat)) 
par(mfrow=c(1,3)) 
for(i in split.dat){image(array(i,c(4,2)))} 

Есть ли лучшие способы сделать то же самое? Был бы также признателен за любые предложения по составлению таких данных, кроме image

ответ

2

Вот некоторые другие варианты, хотя то, как вы это делаете, прекрасно.

apply(newdat, 2, function(i) image(matrix(i, 4, 2))) 

Или, используя raster вместо

library(raster) 
par(mfrow=c(1,3)) 
apply(newdat, 2, function(i) plot(raster(matrix(i, 4, 2))) # plot as raster 
# or 
apply(newdat, 2, function(i) plot(raster(matrix(i, 4, 2)), useRaster=FALSE)) 
# pictured below, uses image() 

enter image description here

Или с помощью persp

nr <- 4 
nc <- 2 
par(mfrow=c(1,3)) 
apply(newdat, 2, function(i) 
    persp(0:nc, 0:nr, matrix(1, (nc+1), (nr+1)), zlim=c(0,2), phi=270, 
     box=FALSE, col = t(matrix(i, 4, 2)))) 
# the color matrix here is using the integers to define colors, but you may want to adjust that. 

enter image description here

Или levelplot из lattice:

library(lattice) 
library(gridExtra) # for grid.arrange() 
p1 <- levelplot(t(apply(matrix(newdat[,1], 2, 4, byrow=TRUE), 1, rev))) 
p2 <- levelplot(t(apply(matrix(newdat[,2], 2, 4, byrow=TRUE), 1, rev))) 
p3 <- levelplot(t(apply(matrix(newdat[,3], 2, 4, byrow=TRUE), 1, rev))) 

grid.arrange(p1, p2, p3, ncol=3) 

# Or in a loop: 
p <- apply(newdat, 2, function(i) levelplot(t(apply(matrix(i, 2, 4, byrow=TRUE), 1, rev)))) 

grid.arrange(p[[1]], p[[2]], p[[3]], ncol=length(p)) 

enter image description here

+0

большое спасибо за все ваши ответы, они полезны. Я использовал levelplot() раньше, но не растровый или persp – user1967473

2

Я думаю, что это решит вашу проблему с ggplot2. Однако ваши данные находятся в странном формате, и непонятно, почему они должны быть построены так, как вы описываете. Мне кажется, что есть некоторые переменные, которые отсутствуют, в частности, соответствующие row и col в кадре данных newdat, который я создаю. Я рекомендую вам прочитать tidy data paper от Hadley Wickham.

require(tidyr) 
require(dplyr) 
require(ggplot2) 

rss<-c("rs","total","rs","total","total","total","rs","rs") 
css<-c("G","S","S","Q","Q","Q","G","G") 
batch<-c("5","6","6","7","7","8","7","5") 
dat<-data.frame(rss,css,batch) 

# convert into tidy data frame 
dat %>% mutate(col=c(rep(1,4), rep(2,4)), row=c(1:4, 1:4)) %>% 
    gather(key, value, rss:batch) -> newdat 

# plot 
ggplot(newdat, aes(x=col, y=row, fill=value)) + 
    geom_tile() + 
    facet_wrap(~key) + 
    scale_x_discrete(breaks=c(1,2), limits=c(1,2)) + 
    theme_bw() 

Результат:

enter image description here

+0

спасибо за ваш ответ и за аккуратную бумагу. Фактические данные имеют столбец с образцом #, и используемый мной кадр данных - это просто тест. Я пытаюсь визуализировать рандомизированный макет, заказанный в самом важном состоянии, и в конечном итоге выбрать оптимальный макет, основанный на всех трех условиях – user1967473

Смежные вопросы