使用通用美学和跨几何的数据框过滤ggplot2的几何

时间:2018-07-12 15:59:49

标签: r ggplot2

说我有以下数据框:

# 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)),然后在适当的几何范围内声明我的过滤或子集标准?

3 个答案:

答案 0 :(得分:1)

您可以为所有z记录绘制线条和点,但是通过将NA传递到scale_linetype_manualscale_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

答案 1 :(得分:1)

另一种选择是spread数据,然后提供y的美感。

library(tidyverse)
df %>% spread(z,y) %>%
    ggplot(aes(x = x))+
    geom_point(aes(y = A))+
    geom_line(aes(y = B))

答案 2 :(得分:0)

我发现问题中的示例最易读,尽管很冗长。有关处理更多案件的问题的第二部分仅需要在filter中进行更复杂的测试,例如在处理时使用%in%(或grepgrepl等)有多种情况。利用访问层中默认绘图数据的可能性,并如@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