2012-05-01 73 views
3

這裏是我的問題:barplot在循環中的R

#data 1: 
lab1 <- 1:10 
group <- rep(1:3, each = length (lab1)) 
label <- rep(lab1, 3) 
avar <- rep(c(0, 1, 4, 5, 6, 8, 10, 11, 12, 13), 3) 
myd <- data.frame (group, label, avar) 

# data 2 
fillcol <- rep(rnorm(length(lab1)-1, 0.5, 0.2), 3) 
group1 <- rep(1:3, each = length(fillcol)/3) 
# this variable will be used to fill color in bars 
filld <- data.frame(group1, fillcol) 

# now plotting 
par(mfrow = c(3, 1)) 
par(mar = c(2.5, 1, 2.5, 1)) 

#plot1 
myd1 <- myd[myd$group ==1,] 
filld1 <- filld[filld$group1 ==1,] 
blues <- colorRampPalette(c("yellow", "blue")) 
barplot(as.matrix(diff(myd1$avar)), horiz=T, col=blues(10)[10* filld1$fillcol], 
axes=F, xlab="Mark") 
axis(1, labels=myd$label, at=myd$avar) 
axis(3, labels=myd$avar, at=myd$avar) 

雖然這個樣本數據集,我有很多變數,我想這個過程自動化。

for (i in 1:length(unique(myd$group))){ 
     par(mfrow = c(i, 1)) 
     par(mar = c(2.5, 1, 2.5, 1)) 
       myd[i] <- myd[myd$group ==i,] 
     filld[i] <- filld[filld$group1 ==i,] 
     blues <- colorRampPalette(c("yellow", "blue")) 
     barplot(as.matrix(diff(myd[i]$avar)), horiz=T, 
    col=blues(10)[10* filld1$fillcol], axes=F, xlab="Mark") 
     axis(1, labels=myd[i]$label, at=myd[i]$avar) 
     axis(3, labels=myd[i]$avar, at=myd[i]$avar) 
     } 
Error in dim(data) <- dim : attempt to set an attribute on NULL 
In addition: Warning messages: 
1: In `[<-.data.frame`(`*tmp*`, i, value = list(group = c(1L, 1L, 1L, : 
    provided 3 variables to replace 1 variables 
2: In `[<-.data.frame`(`*tmp*`, i, value = list(group1 = c(1L, 1L, : 
    provided 2 variables to replace 1 variables 

編輯:我想,讓我在循環中創建多個圖形,以創建一個循環:

enter image description here

PS:我是新來的R和計算器。請原諒我,如果這個問題是不恰當的,雖然我讀的指導方針,並嘗試堅持下去

+0

你在看什麼呢?你沒有得到預期的產出?你在找什麼輸出? –

+0

@JeffAllen請參閱我的編輯 – shNIL

回答

2

如果你在這樣的功能包,你應該能夠得到它的工作,並多次調用。

colbarplot <- function(group) { 

    myd1 <- myd[myd$group == group,] 
    filld1 <- filld[filld$group1 == group,] 
    blues <- colorRampPalette(c("yellow", "blue")) 
    barplot(as.matrix(diff(myd1$avar)), horiz=T, 
      col=blues(10)[10* filld1$fillcol], 
      axes=F, xlab="Mark") 
    axis(1, labels=myd$label, at=myd$avar) 
    axis(3, labels=myd$avar, at=myd$avar) 
} 

par(mfrow = c(3, 1)) 
par(mar = c(2.5, 1, 2.5, 1)) 
sapply(unique(myd$group),function(x) colbarplot(x)) 

這會給你在一個頁面上的多個圖。

0

如果要產生一系列barplots的那麼你的代碼似乎沒什麼問題。如果你想製作一個帶子組的條形圖,那麼你可以看看這個鏈接: http://www.harding.edu/fmccown/r/

0

這裏有兩個問題。你無意中覆蓋在迴路「MYD」和「filld」。 其次,你應該在一開始指定mfrow,然後拿出地塊(本例中3)。你在中間復位mfrow。不是你想要的。

試試這個:

opar <- par(mfrow = c(length(unique(myd$group)), 1), mar = c(2.5, 1, 2.5, 1)) 

for (i in 1:length(unique(myd$group))){ 
    myd1 <- myd[myd$group ==i,] 
    filld1 <- filld[filld$group1 ==i,] 
    blues <- colorRampPalette(c("yellow", "blue")) 
    barplot(as.matrix(diff(myd1$avar)), horiz=T, 
     col=blues(10)[10* filld1$fillcol], axes=F, xlab="Mark") 
    axis(1, labels=myd1$label, at=myd1$avar) 
    axis(3, labels=myd1$avar, at=myd1$avar) 
} 

par(opar);