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

Lyn*_*akr 2 r ggplot2

假设我有以下数据框:

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

我想绘制z == "A"点和z == "B"线的情况。够简单的。

\n\n
library(ggplot2)\n# Plot data\ng <- ggplot()\ng <- g + geom_point(data = df %>% filter(z == "A"), aes(x = x, y = y))\ng <- g + geom_line(data = df %>% filter(z == "B"), aes(x = x, y = y))\ng\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n\n

我的数据框和点和线的美观是相同的,所以这看起来有点冗长 \xe2\x80\x93 特别是如果我想多次执行此操作(例如,z == "A"通过z == "Z")。有没有一种方法可以让我ggplot(df, aes(x = x, y = y))在适当的几何图形中声明并随后声明我的过滤或子集标准?

\n

Ped*_*alo 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述