代码之家  ›  专栏  ›  技术社区  ›  Dan

在ggplot2的geoms中使用通用美学和geoms中的数据帧进行过滤

  •  1
  • Dan  · 技术社区  · 6 年前

    假设我有以下数据框:

    # Dummy data frame
    df <- data.frame(x = rep(1:5, 2), y = runif(10), z = rep(c("A", "B"), each = 5))
    
    #    x          y z
    # 1  1 0.92024937 A
    # 2  2 0.37246007 A
    # 3  3 0.76632809 A
    # 4  4 0.03418754 A
    # 5  5 0.33770400 A
    # 6  1 0.15367174 B
    # 7  2 0.78498276 B
    # 8  3 0.03341913 B
    # 9  4 0.77484244 B
    # 10 5 0.13309999 B
    

    我想把案件安排在 z == "A" 作为点和案例 z == "B" 作为线条。很简单。

    library(ggplot2)
    # Plot data
    g <- ggplot()
    g <- g + geom_point(data = df %>% filter(z == "A"), aes(x = x, y = y))
    g <- g + geom_line(data = df %>% filter(z == "B"), aes(x = x, y = y))
    g
    

    enter image description here

    我的数据框架和点和线的美感是相同的,所以这看起来有点冗长,特别是如果我想做很多次(例如, Z==“A” 通过 z == "Z" )有什么方法可以说明吗 ggplot(df, aes(x = x, y = y)) 然后在适当的GEMS中说明我的过滤或子集设置标准?

    3 回复  |  直到 6 年前
        1
  •  1
  •   pogibas    6 年前

    可以为所有对象绘制线条和点 z 记录,但通过时删除不需要的线条和点 NA scale_linetype_manual scale_shape_manual :

    library(ggplot2)
    ggplot(df, aes(x, y, linetype = z, shape = z)) +
        geom_line() +
        geom_point() +
        scale_linetype_manual(values = c(1, NA)) +
        scale_shape_manual(values = c(NA, 16))
    

    enter image description here

        2
  •  1
  •   AndS.    6 年前

    另一个选择是 spread 数据,然后只提供Y美学。

    library(tidyverse)
    df %>% spread(z,y) %>%
        ggplot(aes(x = x))+
        geom_point(aes(y = A))+
        geom_line(aes(y = B))
    
        3
  •  0
  •   Pedro J. Aphalo    6 年前

    我发现问题本身中的例子最易读,尽管很冗长。关于处理更多案例的问题的第二部分只需要在 filter 例如使用 %in% (或) grep , grepl 等)处理多个案件时。利用访问层内默认绘图数据的可能性,正如@mrflick所提到的,将美学的映射从各个层中移出会导致代码更加简洁。所有早先的答案都能完成计划,所以在这方面,我的答案并不比任何一个都好…

    library(ggplot2)
    library(dplyr)
    df <- data.frame(x = rep(1:5, 4), 
                     y = runif(20), 
                     z = rep(c("A", "B", "C", "Z"), each = 5))
    
    g <- ggplot(data = df, aes(x = x, y = y)) +
      geom_point(data = . %>% filter(z %in% c("A", "B", "C"))) +
      geom_line(data = . %>% filter(z == "Z"))
    g
    

    enter image description here