首页 > 解决方案 > ggplot2 在彩色线条上添加彩色形状并将两者组合成一个图例

问题描述

我在 ggplot2 中得到了下图,这几乎正是我想要的。我想改变的一个细节是在线条上放置不同的形状,以防万一有人色盲,无法区分我最终选择的两种颜色。

library(ggplot2)
color1 = "red"
color2 = "blue"
DF1.grp1 <- data.frame(X=c(5,10,15,20,25,30),
Y=c(1,2,3,4,5,6),grp=rep("grp1",6)) 
DF1.grp2 <- data.frame(X=c(5,10,15,20,25,30),
Y=c(2,3,4,4,5,9),grp=rep("grp2",6))
DF1 <- rbind(DF1.grp1,DF1.grp2)
ggplot(shape=DF1$grp) + #
geom_line(data=DF1,aes(x=X,y=Y,color=grp),size=1)+
geom_point(data=DF1,aes(x=X,y=Y,color=grp),size=3)+
xlab("x variable") + 
ylab("y variable") + 
scale_colour_manual(values=c(color1,color2)) + 
labs(color="") +
geom_density(alpha = 0.5) + theme_bw()+theme(legend.position="bottom")

在此处输入图像描述

在该geom_point行中,我尝试了包含shape=grp,这确实在每行上给了我不同的形状和正确的颜色。但是,图例分别给出了颜色和形状,并将形状设置为黑色。

library(ggplot2)
color1 = "red"
color2 = "blue"
DF1.grp1 <- data.frame(X=c(5,10,15,20,25,30),
Y=c(1,2,3,4,5,6),grp=rep("grp1",6)) 
DF1.grp2 <- data.frame(X=c(5,10,15,20,25,30),
Y=c(2,3,4,4,5,9),grp=rep("grp2",6))
DF1 <- rbind(DF1.grp1,DF1.grp2)
ggplot(shape=DF1$grp) + #
geom_line(data=DF1,aes(x=X,y=Y,color=grp),size=1)+
geom_point(data=DF1,aes(x=X,y=Y,color=grp,shape=grp),size=3)+
xlab("x variable") + 
ylab("y variable") + 
scale_colour_manual(values=c(color1,color2)) + 
labs(color="") +
geom_density(alpha = 0.5) + theme_bw()+theme(legend.position="bottom")

在此处输入图像描述

对我来说理想的情节是通过在图例的蓝色部分放置一个蓝色三角形和在图例的红色部分放置一个红色圆圈来更改第一张图像,替换那里的圆圈。

对我的第一个代码块进行哪些适当的更改以完成此操作?

标签: rggplot2graph

解决方案


这是一个简单的解决方案

library(ggplot2)

DF1.grp1 <- data.frame(X=c(5,10,15,20,25,30),
                       Y=c(1,2,3,4,5,6),grp=rep("grp1",6)) 
DF1.grp2 <- data.frame(X=c(5,10,15,20,25,30),
                       Y=c(2,3,4,4,5,9),grp=rep("grp2",6))
DF1 <- rbind(DF1.grp1,DF1.grp2)

ggplot(DF1, aes(X, Y, color = grp, shape = grp)) +
  geom_point() +
  geom_line() +
  scale_colour_manual(values=c('red','blue'))+
  scale_shape_manual(values = c(24,25))+
  theme_bw()+theme(legend.position="bottom")

reprex 包于 2020-02-07 创建(v0.3.0)


对于您的扩展问题

我使用的形状已经是可以填充的。如果您将美学融入个人geoms,您就有可能单独改变它们。这就是我在下面的代码中所做的,我使用了fill而不是color。特定的图例geom可以guide = 'none'通过scale_.

library(ggplot2)

DF1.grp1 <- data.frame(X=c(5,10,15,20,25,30),
                       Y=c(1,2,3,4,5,6),grp=rep("grp1",6)) 
DF1.grp2 <- data.frame(X=c(5,10,15,20,25,30),
                       Y=c(2,3,4,4,5,9),grp=rep("grp2",6))
DF1 <- rbind(DF1.grp1,DF1.grp2)

ggplot(DF1, aes(X, Y)) +
  geom_point(aes(fill = grp, shape = grp)) +
  geom_line(aes(color = grp)) +
  scale_colour_manual(values=c('red','blue'), guide = 'none')+
  scale_shape_manual(values = c(24,25))+
  theme_bw()+theme(legend.position="bottom") 

reprex 包(v0.3.0)于 2020 年 2 月 8 日创建

对于您进一步扩展的问题

library(ggplot2)

DF1.grp1 <- data.frame(X=c(5,10,15,20,25,30),
                       Y=c(1,2,3,4,5,6),grp=rep("grp1",6)) 
DF1.grp2 <- data.frame(X=c(5,10,15,20,25,30),
                       Y=c(2,3,4,4,5,9),grp=rep("grp2",6))
DF1 <- rbind(DF1.grp1,DF1.grp2)

ggplot(DF1, aes(X, Y)) +
  geom_point(aes(fill = grp, shape = grp), stroke =0, size =5) +
  geom_line(aes(color = grp)) +
  scale_colour_manual(values=c('red','blue'), guide = 'none')+
  scale_fill_manual(values=c('red','blue'))+
  scale_shape_manual(values = c(24,25))+
  theme_bw()+
  theme(legend.position="bottom") 

reprex 包(v0.3.0)于 2020 年 2 月 8 日创建

我已经添加scale_fill_并将行程设置geom_point为零。我也把点放大了,所以你可以看得更清楚。


推荐阅读