barplot在R中循环(barplot in loop in R)

2019-07-29 05:57发布

这里是我的问题:

#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

编辑:我想,这样我创建循环中的多个图形创建一个循环:

PS:我是新来的R和计算器。 请原谅我,如果这个问题是不恰当的,虽然我读的指导方针,并尝试坚持下去

Answer 1:

如果你在这样的功能包,你应该能够得到它的工作,并多次调用。

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))

这将使多条曲线在一个页面上你了。



Answer 2:

在这里有两个问题。 你无意中覆盖在回路“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);


Answer 3:

如果你想制作一系列barplots的那么你的代码似乎没什么问题。 如果你想制作与亚组的条形图,那么你可以看看这个链接: http://www.harding.edu/fmccown/r/



文章来源: barplot in loop in R