r - 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")
对我来说理想的情节是通过在图例的蓝色部分放置一个蓝色三角形和在图例的红色部分放置一个红色圆圈来更改第一张图像,替换那里的圆圈。
对我的第一个代码块进行哪些适当的更改以完成此操作?
解决方案
这是一个简单的解决方案
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
为零。我也把点放大了,所以你可以看得更清楚。
推荐阅读
- c# - AWSSDK.S3 C# Dll 错误在 PowerShell 控制台中但不在 ISE 中(我们计算的请求签名与您提供的签名不匹配。)
- java - Java:NetBeans 和 jdk_1.8 中的 -source 8 不支持模块
- wordpress - Fail2Ban - 如何在 install.php 文件上阻止 BruteForce?
- android - 滚动时隐藏 Androdi Kotlin 视图
- javascript - 使用 @ViewChild 获取时获取 undefined 的值
元素? - typescript - Apollo 的 TypeScript 类型使用Mutation 的 refetchQueries?
- vue.js - 如何动态导入 Vue 3 组件?
- laravel-5 - 如何在播种机中使用配置数据
- python - PyArrow:如何使用新的文件系统接口将文件从本地复制到远程?
- wordpress - 我需要在生产就绪项目中包含 node_modules 吗?