我正在尝试迭代地构建我的数据的所有可能的图表,由表格中的每一列着色。
到目前为止,我有这段代码:
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中工作?
更新更新了代码,以便可以在新的环境中运行该示例。我希望这四个地块颜色不同。其中两个col
和Time
显然应该是单色,另外两个Value
和P
应该有不同的颜色,由D
确定,因此P = c(1, 2, 3, 2, 1), D = c(4, 5, 6, 7, 8)
应该有5种不同的颜色,而D
应该只有3种
答案 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)
答案 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]])
在示例中,您会看到我删除了column
到cc
的分配,因为我们不需要它,并且我明确设置了要使用的颜色变量。如果我们运行上面的代码,一切都运行没有错误,但正如OP所指出的,每个图都完全相同。此外,我们注意到颜色的因子水平在所有图上都是相同的,并且等于最后一次迭代的因子水平。这让我想到ggplot
如何分配颜色。所以,让我们将colors
更改为其他内容并重新运行已生成的图。
colors <- factor(20:30)
plot[[p1]]
这给了我们一个错误,告诉我们美学必须是长度1或与数据(5)相同。这似乎意味着在绘图时,用于分配颜色的数据在那时被绘制并且不被“保存”。因此,当您运行multiplot
函数时,所有图形都会从相同的数据中绘制颜色,在您的情况下为temp23_before6[, column]
,其中column
现在是静态的并保存为最后一栏名称。