ggplot:如何将第二个图例添加到所有因素都具有不同美学并且只有 1 个因素具有颜色渐变的图中

ggplot: How can I add a second legend to a plot where factors all have different aesthetics and only 1 factor has a color gradient

我已经编写了这个散点图,但遇到了困难,需要一些帮助。我希望它包含两个图例: 一个是仅针对其中一个因素(如下所示)的强度,这是我能够做到的 另一个将包括所有因素的形状,也许还包括颜色——这个我想不通。

这是我的数据集和代码:

lvl <-  c("mid","mid","mid","mid","mid","mid","mid","mid","mid","mid","high","high","high","high",            
          "high","high","high","high","high","high","low","low","low","low","low","low","low",
          "low","low","low")
x <- c(6.06,4.42,6.81,1.7,1.29,6.75,4.48,2.64,4.31,3.93,1.56,2.25,6.53,4,5.09,3.7,1.19,7.71,4.4,8.49,
       4.14,5.37,7.1,2.94,1.75,2.49,1.37,1.22,9.29,1.37)
y <- c(4.17,1.41,6.79,1.72,1.45,7.29,4.49,2.72,1.34,6.66,3.94,2.84,7.3,3.97,4.95,9.03,5.23,8.77,1.13,
       2.76,5.3,4.53,7.42,3.15,6.97,2.36,1.07,1.16,9.17,1.72)
z <- c(1.26,1.34,2.53,3.83,2.78,9.93,1.23,9.97,1.71,1.3,1.31,1,6.06,2.26,3.29,2.29,2.52,2.02,2.68,
       9.7,2.9,1.7,6.65,9.54,2.05,1.06,3.59,1.16,2.99,1.14)

data <- data.frame(lvl,x,y,z)
low <- data %>% filter(lvl == "low")
mid <- data %>% filter(lvl == "mid")
high <- data %>% filter(lvl == "high")

ggplot(data = result_df, aes(x=x, y=y, color=lvl, shape=lvl)) +
     geom_point(data = high, color = "gray81", shape = 18, size = 2, aes(color="high")) +
     geom_point(data = mid, shape = 2, size = 4, stroke = 1.5, color = "black",aes(color="mid")) +
     theme_classic()+
     theme(legend.position="right")+
     geom_point(data = low, size = 4, shape = 21, stroke = 1.5, color = "black", aes(fill = log10(z), 
     color = "low")) + 
     scale_fill_gradientn(name = "z Intensity" , colors = c("darkblue", "blue","red", "darkred"))+ 
     scale_x_log10()+
     scale_y_log10()

这是我的情节:

我试过使用 scale_color_manual() 手动添加一个,但似乎没有成功。我相信我的问题与我如何将参数映射到 aes 有关,但我一整天都在尝试修改代码,但没有成功。显然我是一只小鹿,任何帮助都会提前表示感谢。

您在几何中添加了两次 color。您应该使用 scale_color_manual 来选择颜色,使用 scale_shape_manual 来选择形状:

ggplot(data = data, aes(x=x, y=y, color=lvl, shape=lvl)) +
  geom_point(data = high,aes(color="high",shape ="high"), size = 2) +
  geom_point(data = mid,aes(color="mid", shape ="mid"),  size = 4, stroke = 1.5) +
  geom_point(data = low, aes(fill = log10(z),color = "low", shape = "low"), size = 4, stroke = 1.5) +
  scale_shape_manual(values=c(18, 21, 2))+
  scale_fill_gradientn(name = "z Intensity" , colors = c("darkblue", "blue","red", "darkred"))+ 
  scale_color_manual(values = c("gray81", "black","black"))+ 
  theme_classic()+
  theme(legend.position="right")+
  scale_x_log10()+
  scale_y_log10()