如何对抗R?

时间:2016-03-28 13:15:48

标签: r

我正在尝试迭代地构建我的数据的所有可能的图表,由表格中的每一列着色。

到目前为止,我有这段代码:

SELECT 
   COUNT(if( sex = "male", 1, NULL) as maleUser,
   COUNT(if( sex = "female", 1, NULL) as femaleUser,
   COUNT( if( YEAR(created) = YEAR(NOW())), 1, NULL) as currentYearUser
FROM user
WHERE companyID = 123

不幸的是 # ----- next is a function taken from http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ # --- not relevant to the question, my code is in the end of the snippet library(ggplot2) multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) { library(grid) # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) # If layout is NULL, then use 'cols' to determine layout if (is.null(layout)) { # Make the panel # ncol: Number of columns of plots # nrow: Number of rows needed, calculated from # of cols layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), ncol = cols, nrow = ceiling(numPlots/cols)) } if (numPlots==1) { print(plots[[1]]) } else { # Set up the page grid.newpage() pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) # Make each plot, in the correct location for (i in 1:numPlots) { # Get the i,j matrix positions of the regions that contain this subplot matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE)) print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row, layout.pos.col = matchidx$col)) } } } #---------------------------------------------------------------- temp23_before6 <- data.frame(TIME = c(1, 2, 3, 4, 5), VALUE = c(1, 2, 3, 4, 5), P = c(1, 2, 3, 2, 1), D = c(4, 5, 6, 7, 8)) i <- 1 p <- list() for (col in names(temp23_before6)) { l <-length(unique(temp23_before6[, col])) if (l < 20 && l > 1) { cc <- col p[[i]] <- ggplot(temp23_before6, aes(TIME, VALUE, colour=factor(temp23_before6[, cc]))) + geom_point() + labs(title=col) i <- i + 1 } } multiplot(plotlist = p, cols = as.integer(sqrt(i))) 由于关闭而没有改变,我收到的所有图都完全相同。与其他语言一起使用的常用技巧 - 将cc分配给局部变量 - 不起作用。如何使它在R中工作?

更新更新了代码,以便可以在新的环境中运行该示例。我希望这四个地块颜色不同。其中两个colTime显然应该是单色,另外两个ValueP应该有不同的颜色,由D确定,因此P = c(1, 2, 3, 2, 1), D = c(4, 5, 6, 7, 8)应该有5种不同的颜色,而D应该只有3种

2 个答案:

答案 0 :(得分:6)

这个问题更多地与hadlyverse内的编程有关。我们进行了两项更改,1)添加aes_string以允许在ggplot调用中进行评估,以及2)清理要由着色列命名的图例:

p[[i]] <- ggplot(temp23_before6, aes_string("TIME", "VALUE", 
            colour=factor(temp23_before6[,cc]))) + 
            geom_point() + labs(title=col) + scale_colour_discrete(name=cc)

enter image description here

答案 1 :(得分:0)

我认为问题在于ggplot在打印情节时如何引用其颜色。我对此并不完全确定,但让我们看一个例子。

temp23_before6 <- data.frame(TIME = c(1, 2, 3, 4, 5),
                             VALUE = c(1, 2, 3, 4, 5),
                             P = c(1, 2, 3, 2, 1),
                             D = c(4, 5, 6, 7, 8))
i <- 1
p <- list()
for (column in names(temp23_before6)) {
  l <-length(unique(temp23_before6[, column]))
  if (l < 20 && l > 1) {
    colors <- factor(temp23_before6[, column])
    print(colors)
    p[[i]] <- ggplot(temp23_before6, aes(TIME, VALUE, colour=colors)) + 
      geom_point() + labs(title=column)

    i <- i + 1
  }
}

plot(p[[1]])

在示例中,您会看到我删除了columncc的分配,因为我们不需要它,并且我明确设置了要使用的颜色变量。如果我们运行上面的代码,一切都运行没有错误,但正如OP所指出的,每个图都完全相同。此外,我们注意到颜色的因子水平在所有图上都是相同的,并且等于最后一次迭代的因子水平。这让我想到ggplot如何分配颜色。所以,让我们将colors更改为其他内容并重新运行已生成的图。

colors <- factor(20:30)
plot[[p1]]

这给了我们一个错误,告诉我们美学必须是长度1或与数据(5)相同。这似乎意味着在绘图时,用于分配颜色的数据在那时被绘制并且不被“保存”。因此,当您运行multiplot函数时,所有图形都会从相同的数据中绘制颜色,在您的情况下为temp23_before6[, column],其中column现在是静态的并保存为最后一栏名称。