ggplot 使用变量有条件地改变形状或形状填充

mic*_*706 3 r ggplot2

我正在尝试创建一个折线图,显示未检测到的数据的开放符号和表示检测到的数据的封闭(填充)符号。这是一些可以使用的代码:

date <- c("1991-04-25","1991-04-26","1991-04-27","1991-04-28","1991-04-29","1991-04-25","1991-04-26","1991-04-27","1991-04-28","1991-04-29","1991-04-25","1991-04-26","1991-04-27","1991-04-28","1991-04-29")
Parameter <- c("TEA","TEA","TEA","TEA","TEA","COFFEE","COFFEE","COFFEE","COFFEE","COFFEE","WATER","WATER","WATER","WATER","WATER")
data <- c(5,4,7,3,6,4,6,8,6,3,7,8,7,6,7)
DetectYN <- c("Y","N","Y","Y","Y","N","Y","Y","Y","N","N","N","Y","Y","N")

df <- data.frame(date, Parameter,data, DetectYN)

df$date <- as.Date(df$date, "%Y-%m-%d" )
df$DetectYN <-as.character(df$DetectYN)

ggplot(df, aes(x=date, y=data)) +
geom_point(size=4, aes(shape = Parameter , colour= Parameter)) +
geom_line(aes(x=date, y=data,color = Parameter)) +
scale_shape_manual(values=ifelse(DetectYN == "Y",c(15,16,17),c(0,1,2)) , guide = "none")
Run Code Online (Sandbox Code Playgroud)

这将创建以下图表 - 几乎正确,只是我的 ifelse 没有达到预期的效果。我希望 DetectYN =“N”为空心(无填充),并且我希望 DetectYN =“Y”被填充。现有的符号需要保留。有人可以帮我解决这个问题吗?在此输入图像描述

J.C*_*Con 5

这是一个看似困难的问题!该解决方案直接回答了您的问题,希望有一定用处。然而,我担心它可能会因为大型、复杂的数据集而变得混乱。

我添加了一个列,组合了您希望控制形状的两个变量,然后通过这个新列定义形状,对形状编号进行排序以获得所需的结果。

df$shape<-paste(Parameter, DetectYN)

ggplot(df, aes(x=date, y=data, colour= Parameter)) +
  geom_point(size=4, aes(shape=shape))+
  geom_line() +
  scale_shape_manual(values=c(0,15,1,16,2,17) , guide = "none")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述