我试图一次性绘制多个因子列,使用ggplot2作为绘图引擎。
直接绘制多个指标列:
FALSE
但是,我没有成功地在一次拍摄中绘制多个 factor (定性)列。我想以编程方式选择列,即不直接命名它们。
我尝试了这个,但不会产生合理的结果:
merge
我认为可能有这样的解决方案:
library(ggplot2)
library(dplyr) # dplyr 0.5.0 select_if
library(purrr)
data(diamonds)
diamonds %>%
select_if(is.numeric) %>%
gather %>%
ggplot(aes(x = value)) +
geom_histogram() +
facet_wrap(~key)
diamonds %>%
select_if(is.factor) %>%
gather %>%
ggplot(aes(x = value)) + geom_bar() +
facet_wrap(~key) +
coord_flip()
应该被某个列占位符替换(所以我在这里直接命名了列,我想避免使用,因为我实际上有很多列。)
for循环可能会完成这项工作,但我想用dplyr到达那里。
答案 0 :(得分:3)
这里的诀窍是在scales = free
电话中使用facet
。例如:
diamonds %>%
select_if(is.factor) %>%
gather %>%
ggplot(aes(x = value)) + geom_bar() +
facet_wrap(~key, scales = 'free') +
theme_bw() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))
不幸的是,免费比例和coord_flip
不会很好。您可以使用the ggstance
package中的geom_barh
。或者,您可以在每列上使用lapply
来获取ggplot
个对象的列表,并使用cowplot
包将它们拼接在一起。
答案 1 :(得分:1)
可能不如@Axeman优雅,但也在工作,并与coord_flip
合作:
library(gridExtra)
gg_bar <- function(x, ...){
{
ggplot(data_frame(x), aes(x = x)) +
geom_bar() +
coord_flip()
}
}
diamonds %>%
select_if(negate(is.numeric)) %>%
lapply(., function(x) gg_bar(x)) -> gg_bar_list
do.call(grid.arrange, gg_bar_list)
但是,没有显示变量(“x”)的名称,这不太漂亮。