假设我有以下数据框:
\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\nRun Code Online (Sandbox Code Playgroud)\n\n我想绘制z == "A"点和z == "B"线的情况。够简单的。
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\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n我的数据框和点和线的美观是相同的,所以这看起来有点冗长 \xe2\x80\x93 特别是如果我想多次执行此操作(例如,z == "A"通过z == "Z")。有没有一种方法可以让我ggplot(df, aes(x = x, y = y))在适当的几何图形中声明并随后声明我的过滤或子集标准?
我发现问题本身的例子最具可读性,尽管很冗长。关于处理更多情况的问题的第二部分只需要在处理多种情况时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)
| 归档时间: |
|
| 查看次数: |
6133 次 |
| 最近记录: |