说我有以下数据框:
# 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
我的数据框和点和线的美感是相同的,所以这似乎有些冗长-特别是如果我想做很多次(例如,z == "A"
至z == "Z"
)。有没有一种方法可以声明ggplot(df, aes(x = x, y = y))
,然后在适当的几何范围内声明我的过滤或子集标准?
答案 0 :(得分:1)
您可以为所有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))
答案 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%
(或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