R ggplot2:合并两个图例

R ggplot2:合并两个图例,r,ggplot2,legend,R,Ggplot2,Legend,我试图用ggplot2用两组不同的点绘制一个区域,但我总是得到两个不同的图例。我读过很多书,但我还有两个传说。 下面是代码和图表。 多谢各位 library(ggplot2) library(dplyr) set.seed(1) df <- data.frame(x = letters, y = 1:26 +runif(26), z = 2*(1:26) + runif(26), jj

我试图用ggplot2用两组不同的点绘制一个区域,但我总是得到两个不同的图例。我读过很多书,但我还有两个传说。 下面是代码和图表。 多谢各位

library(ggplot2)
library(dplyr)
set.seed(1)
df <- data.frame(x = letters,
                 y = 1:26 +runif(26),
                 z =  2*(1:26) +  runif(26),
                 jj = 1:26,
                 hh = 1:26*2,
                 x1 = 1:26)

some_names <- df %>% 
  filter(row_number() %% 10 == 1) %>% 
  select(x,x1)

p <- df %>% 
  ggplot(aes(x1)) +
  geom_ribbon(aes(ymin = y, ymax = z, fill = "area")) +
  geom_point(aes(y = jj, colour = "points1")) + 
  geom_point(aes(y = hh, colour = "points2")) +
  scale_x_continuous(breaks = some_names %>% select(x1) %>% unlist %>% unname,
                     labels =  some_names %>% select(x) %>% unlist %>% unname )

p + scale_fill_manual(name = "legend",
                      values = c("area" = "red","points1" = NA,"points2" = NA)) +
  scale_colour_manual(name = "legend",
                      values = c("area" = NA ,"points1" = "blue","points2" = "purple")) 

你可以在你的血管里做点什么

library(tidyverse)
packageVersion("ggplot2")
# [1] ‘2.2.1’
df %>% 
  gather(var, val, jj, hh) %>% 
  ggplot(aes(x1, val, ymin=y, ymax=z, color=var, fill=var)) + 
  geom_ribbon(color=NA) + 
  geom_point() + 
  scale_color_manual(values=c("blue","purple"), name="leg", labels = c("lab1","lab2")) + 
  scale_fill_manual(values = rep("red", 2), name="leg", labels= c("lab1","lab2"))


一个选项是为每个图元使用内部填充。可能有一种方法可以使用override.aes将点设置为图例中的点,但我无法通过任何快速实验来实现这一点

p <- df %>% 
  ggplot(aes(x1)) +
  geom_ribbon(aes(ymin = y, ymax = z, fill = "area")) +
  geom_point(aes(y = jj, fill = "points1"), shape=21, colour="blue") + 
  geom_point(aes(y = hh, fill = "points2"), shape=21, colour="purple") +
  scale_x_continuous(breaks = some_names %>% select(x1) %>% unlist %>% unname,
                     labels =  some_names %>% select(x) %>% unlist %>% unname ) +
  scale_fill_manual(name = "legend",
                    values = c("area" = "red","points1" = "blue","points2" = "purple"),
                    guide = guide_legend(override.aes=aes(colour=NA)))

p

非常感谢。我想我们已经很接近了,但是传奇故事仍然和我想象的不同。应该有三个元素:区域红色和两组点lab1 blu e lab2purple@LucaMonno这似乎不太奇怪。也许你可以通过类似df%>%gathervar,val,jj,hh%>%bind_rowsdata.framex=NA,y=NA,z=NA,x1=NA,var=\u dummy,val=NA%>%ggplotaesx1,val,ymin=y,ymax=z,color=var,fill=var+geom\u ribboncolor=NA+geom\u ribboncolor=NA,fill=red+geom\u point+scale\u color\u manualvalues=cffff00,蓝色,紫色,name=leg,标签=clab1,lab2,lab3+刻度填充值=cred,repNA,2,name=leg,标签=clab1,lab2,lab3。再次感谢您。我的数据集不够整洁,或者我想要的情节本身不是ggplot'ish?我的意思是传说不是ggplot'ish混合了色彩美学。虽然我假设您可以使用guidescolor=guide_legendoverride.aes=listfill=。。。。然而,由于某种原因,我不明白,它不起作用。@LucaMonno也许你应该删除这个问题,然后再发布一次,并附上所需输出的屏幕截图,以便清楚结果应该是什么样子。以前的帖子没有得到那么多的关注,可能有人有想法,可能会错过。
p <- df %>% 
  ggplot(aes(x1)) +
  geom_ribbon(aes(ymin = y, ymax = z, fill = "area")) +
  geom_point(aes(y = jj, fill = "points1"), shape=21, colour="blue") + 
  geom_point(aes(y = hh, fill = "points2"), shape=21, colour="purple") +
  scale_x_continuous(breaks = some_names %>% select(x1) %>% unlist %>% unname,
                     labels =  some_names %>% select(x) %>% unlist %>% unname ) +
  scale_fill_manual(name = "legend",
                    values = c("area" = "red","points1" = "blue","points2" = "purple"),
                    guide = guide_legend(override.aes=aes(colour=NA)))

p