我想要使用小倍数绘制大量数据系列。 ggplot2和facet_wrap
的组合可以实现我想要的效果,通常可以产生一个6 x 6小平面的小块。这是一个更简单的版本:
问题在于我对小平面条带中的标签没有足够的控制。数据框中列的名称很短,我希望保持这种方式,但我希望facet中的标签更具描述性。我可以使用facet_grid
以便我可以利用labeller
函数,但是似乎没有直接的方法来指定列的数量,并且长行的方面对于此不起作用特别的任务。我错过了一些明显的东西吗?
问。如何在不更改列名的情况下使用facet_wrap时更改构面标签?或者,如何在使用facet_grid时指定列数和行数?
以下是简化示例的代码。在现实生活中,我正在处理多个组,每个组包含数十个数据系列,每个系列都经常更改,因此任何解决方案都必须自动化,而不是依赖于手动分配值。
require(ggplot2)
require(reshape)
# Random data with short column names
set.seed(123)
myrows <- 30
mydf <- data.frame(date = seq(as.Date('2012-01-01'), by = "day", length.out = myrows),
aa = runif(myrows, min=1, max=2),
bb = runif(myrows, min=1, max=2),
cc = runif(myrows, min=1, max=2),
dd = runif(myrows, min=1, max=2),
ee = runif(myrows, min=1, max=2),
ff = runif(myrows, min=1, max=2))
# Plot using facet wrap - we want to specify the columns
# and the rows and this works just fine, we have a little block
# of 2 columns and 3 rows
mydf <- melt(mydf, id = c('date'))
p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
geom_line() +
facet_wrap( ~ variable, ncol = 2)
print (p1)
# Problem: we want more descriptive labels without changing column names.
# We can change the labels, but doing so requires us to
# switch from facet_wrap to facet_grid
# However, in facet_grid we can't specify the columns and rows...
mf_labeller <- function(var, value){ # lifted bodily from the R Cookbook
value <- as.character(value)
if (var=="variable") {
value[value=="aa"] <- "A long label"
value[value=="bb"] <- "B Partners"
value[value=="cc"] <- "CC Inc."
value[value=="dd"] <- "DD Company"
value[value=="ee"] <- "Eeeeeek!"
value[value=="ff"] <- "Final"
}
return(value)
}
p2 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
geom_line() +
facet_grid( ~ variable, labeller = mf_labeller)
print (p2)
答案 0 :(得分:21)
我不太明白。您已经编写了一个功能,可以将短标签转换为长的描述性标签。简单地添加新列并在该列上使用facet_wrap
会出现什么问题?
mydf <- melt(mydf, id = c('date'))
mydf$variableLab <- mf_labeller('variable',mydf$variable)
p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
geom_line() +
facet_wrap( ~ variableLab, ncol = 2)
print (p1)
答案 1 :(得分:8)
要更改标签名称,只需更改facet_wrap
中使用的因子的系数级别。这些将在条带上的facet_wrap
中使用。您可以使用与labeller
中的facet_grid
功能类似的设置。做一些像:
new_labels = sapply(levels(df$factor_variable), custom_labeller_function)
df$factor_variable = factor(df$factor_variable, levels = new_labels)
现在,您可以在factor_variable
中使用facet_wrap
。
答案 2 :(得分:0)
只需将labeller = label_wrap_gen(width = 25, multi_line = TRUE)
添加到facet_wrap()
参数中即可。
例如:... + facet_wrap( ~ variable, ,labeller = label_wrap_gen(width = 25, multi_line = TRUE))
更多信息:?ggplot2::label_wrap_gen
答案 3 :(得分:0)
只需在facet_wrap()参数中添加labeller = label_both。
... + facet_wrap( ~ variable, labeller = label_both)