ggplot2收集通用值

时间:2016-06-16 16:11:08

标签: r ggplot2 tidyr

我正在研究这个df

Col0 <- c("AA", "BB", "CC", "DD","EE","FF")
    Col1 <- c(2,2,2,6,1,1)
    Col2 <- c(2,2,2,1,3,4)
    Col3 <- c(2,2,3,4,6,6)
    Col4 <- c(2,2,3,1,2,1)
    Col5 <- c(2,1,1,1,1,4)
    Col6 <- c(2,4,2,5,4,4)
    Col7 <- c(2,4,2,5,4,4)
    Col8 <- c(2,2,3,4,5,4)
    Col9 <- c(1,3,3,2,2,2)
    df<-data.frame(Col0,Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9)

使用facet我创建了一个图表

library(ggplot2)
library(tidyr)

pl<-df %>%
  gather(Hi, Val, -Col0) %>%
  ggplot(aes(Hi, Val, group = Col0, col = Col0)) + facet_grid(Col0 ~ .)

pl<- pl + geom_line() +theme(
  axis.text.x = element_text(angle = 90, hjust = 1))+ theme( panel.border = element_rect(colour = "black", fill=NA, size=1),legend.direction ="vertical",legend.position = "right")+guides(fill=guide_legend(ncol=1))+scale_y_continuous(labels=comma) +theme(legend.text = element_text(size=6))  

print(pl)

问题是可能的,而不是使用Col0传递给函数值:

value<- names(df[1])

因为我正在研究很多df,我想概括一下这个功能

1 个答案:

答案 0 :(得分:1)

要在函数中使用字符串,您需要ggplot2和tidyr函数的标准评估版本。在tidyr,这些以下划线结束。在ggplot2中,您需要aes_string(或可能aes_)。

tidyr的标准评估部分看起来像这样:

df %>% gather_("Hi", "Val", select_vars_(names(.), 
                                         names(.), 
                                         exclude = "Col0"))

gather_中的所有内容都是字符串。使用select_vars_的代码的复杂部分是因为您要排除列。请参阅here

对于绘图,您只需为aes更改aes_string,并使用字符串作为变量名称。更棘手的部分是如何使用facet_grid中的字符串,可以使用formula ggplot(aes_string("Hi", "Val", group = "Col0", col = "Col0")) + facet_grid(as.formula(paste("Col0", "~."))) 来完成。

对代码部分的更改如下所示:

plotfun = function(data, column) {
    data %>%
        gather_("Hi", "Val", select_vars_(names(.), 
                                          names(.), 
                                          exclude = column)) %>%
        ggplot(aes_string("Hi", "Val", group = column, col = column)) + 
        facet_grid(as.formula(paste(column, "~."))) + 
        geom_line() +
        theme(axis.text.x = element_text(angle = 90, hjust = 1),
              panel.border = element_rect(colour = "black", fill=NA, size=1),
              legend.direction ="vertical",
              legend.position = "right",
              legend.text = element_text(size=6)) + 
        guides(fill=guide_legend(ncol=1)) +
        scale_y_continuous(labels=comma)
}

plotfun(df, "Col0")

剩下的就是把它放到一个函数中。

didSelectRowAtIndexPath

here