首页 文章

ggplot:子集一个使用管道传递数据的层

提问于
浏览
4

我正在尝试将一个图层的子集,我通过管道将数据传递给 ggplot .

这是一个例子:

library(dplyr)
library(ggplot2)
library(scales)

set.seed(12345)
df_example = data_frame(Month = rep(seq.Date(as.Date("2015-01-01"),
                                             as.Date("2015-12-31"), by = "month"), 2),
                        Value = sample(seq.int(30, 150), size = 24, replace = TRUE),
                        Indicator = as.factor(rep(c(1, 2), each = 12)))

df_example %>% 
  group_by(Month) %>% 
  mutate(`Relative Value` = Value/sum(Value)) %>% 
  ungroup() %>% 
  ggplot(aes(x = Month, y = Value, fill = Indicator, group = Indicator)) + 
  geom_bar(position = "fill", stat = "identity") + 
  theme_bw()+ 
  scale_y_continuous(labels = percent_format()) + 
  geom_line(aes(x = Month, y = `Relative Value`))

这给出了:

enter image description here

我想只显示其中一行,如果这样的东西在 geom_line 层中起作用,我将能够做到:

geom_line(subset = .(Indicator == 1), aes(x = Month, y = `Relative Value`))

编辑:

会话信息:

R版本3.2.1(2015-06-18)平台:x86_64-w64-mingw32 / x64(64位)在以下位置运行:Windows Server 2012 x64(build 9200)语言环境:2 LC_COLLATE = English_United States.1252 LC_CTYPE = English_United States.1252 [3] = LC_MONETARY English_United States.1252 LC_NUMERIC = C [5] = LC_TIME English_United States.1252附基础包:2个统计图形grDevices utils的数据集的方法基础相连的其他软件包:2 scales_0.3.0 lubridate_1.3.3 ggplot2_1.0.1 lazyeval_0.1.10 dplyr_0.4.3 RSQLite_1.0.0 readr_0.2.2 [8] RJDBC_0.2-5 DBI_0.3.1 rJava_0.9-7通过命名空间加载(未附加):2 Rcpp_0.12.2 knitr_1.11 magrittr_1.5 MASS_7 . 3-40 munsell_0.4.2 lattice_0.20-31 [7] colorspace_1.2-6 R6_2.1.1 stringr_1.0.0 plyr_1.8.3 tools_3.2.1 parallel_3.2.1 [13] grid_3.2.1 gtable_0.1.2 htmltools_0.2.6 yaml_2.1.13 assertthat_0 .1 digest_0.6.8 [19] reshape2_1.4.1 memoise_0.2.1 rmarkdown_0.8.1 labeling_0.3 stringi_1.0-1 zoo_1.7-12 [25] proto_0.3-10

3 回答

  • 1
    library(dplyr)
    library(ggplot2)
    library(scales)
    
    set.seed(12345)
    df_example = data_frame(Month = rep(seq.Date(as.Date("2015-01-01"),
                                                 as.Date("2015-12-31"), by = "month"), 2),
                            Value = sample(seq.int(30, 150), size = 24, replace = TRUE),
                            Indicator = as.factor(rep(c(1, 2), each = 12)))
    
    df_example %>% 
      group_by(Month) %>% 
      mutate(`Relative Value` = Value/sum(Value)) %>% 
      ungroup() %>% 
      ggplot(aes(x = Month, y = Value, fill = Indicator, group = Indicator)) + 
      geom_bar(position = "fill", stat = "identity") + 
      theme_bw()+ 
      scale_y_continuous(labels = percent_format()) + 
      geom_line(aes(x = Month, y = `Relative Value`,linetype=Indicator)) +
      scale_linetype_manual(values=c("1"="solid","2"="blank"))
    

    收益率:

    enter image description here

  • 2

    tl;dr :将数据传递给该图层,作为根据您的条件对图表数据进行子集的函数 .


    根据ggplots documentation on layers,将数据传递到新图层时有3个选项:

    如果为NULL(默认值),则数据将从调用ggplot()中指定的绘图数据继承 . data.frame或其他对象将覆盖绘图数据 . 将强化所有对象以生成数据帧 . 请参阅fortify()以了解将创建哪些变量 . 将使用单个参数(绘图数据)调用函数 . 返回值必须是data.frame,并将用作图层数据 .

    前两个选项是最常见的选项,但是当通过pyp修改数据时,第三个选项非常适合我们的需求 .

    在您的示例中,将 data = function(x) subset(x,Indicator == 1) 添加到 geom_line 可以解决问题:

    library(dplyr)
    library(ggplot2)
    library(scales)
    
    set.seed(12345)
    df_example = data_frame(Month = rep(seq.Date(as.Date("2015-01-01"),
                                                 as.Date("2015-12-31"), by = "month"), 2),
                            Value = sample(seq.int(30, 150), size = 24, replace = TRUE),
                            Indicator = as.factor(rep(c(1, 2), each = 12)))
    
    df_example %>% 
      group_by(Month) %>% 
      mutate(`Relative Value` = Value/sum(Value)) %>% 
      ungroup() %>% 
      ggplot(aes(x = Month, y = Value, fill = Indicator, group = Indicator)) + 
      geom_bar(position = "fill", stat = "identity") + 
      theme_bw()+ 
      scale_y_continuous(labels = percent_format()) + 
      geom_line(data = function(x) subset(x,Indicator == 1), aes(x = Month, y = `Relative Value`))
    

    This is the resulting plot

  • 0

    您可能会受益于 stat_subset() ,这是我个人使用的统计数据,可在 metR 中找到:https://eliocamp.github.io/metR/articles/Visualization-tools.html#stat_subset

    它有一种称为 subset 的美学,它采用逻辑表达式并相应地对数据进行子集化 .

    library(dplyr)
    library(ggplot2)
    library(scales)
    
    set.seed(12345)
    df_example = data_frame(Month = rep(seq.Date(as.Date("2015-01-01"),
                                                 as.Date("2015-12-31"), by = "month"), 2),
                            Value = sample(seq.int(30, 150), size = 24, replace = TRUE),
                            Indicator = as.factor(rep(c(1, 2), each = 12)))
    
    df_example %>% 
       group_by(Month) %>% 
       mutate(`Relative Value` = Value/sum(Value)) %>% 
       ungroup() %>% 
       ggplot(aes(x = Month, y = Value, fill = Indicator, group = Indicator)) + 
       geom_bar(position = "fill", stat = "identity") + 
       theme_bw()+ 
       scale_y_continuous(labels = percent_format()) + 
       metR::stat_subset(aes(x = Month, y = `Relative Value`, subset = Indicator == 1), 
                   geom = "line")
    

相关问题