如何用ggplot绘制R数据框每行对应各列值的黑白点散点图
解决方案
1. 数据预处理
你的原始数据存在两个需要调整的点:
- PresentDay2列的第一个取值是字母
O,不是数字0,需要先修正为一致的数值格式 - ggplot2更适配长表结构,需要先把宽格式的观测数据转换为长格式
代码如下:
# 加载所需包 library(ggplot2) library(tidyr) library(dplyr) # 修正原始数据错误,转换为长表 observations <- data.frame( "Individuals" = c("Individual1", "Individual2", "Individual3"), "PresentDay1" = c("0","1","1"), "PresentDay2" = c("0","1","1") # 修正原数据的字母O为数字0 ) %>% pivot_longer( cols = starts_with("Present"), names_to = "Day", values_to = "PresentStatus" ) %>% mutate(PresentStatus = factor(PresentStatus, levels = c("0", "1")))
2. 绘图实现
使用geom_point的实心可填充样式,根据在场状态设置填充色即可实现需求:
ggplot(observations, aes(x = Day, y = Individuals)) + # 用shape=21的带边框点,避免白色的不在场点和背景融为一体 geom_point(aes(fill = PresentStatus), shape = 21, size = 8, color = "black") + # 手动设置填充色:1=在场黑,0=不在场白 scale_fill_manual( values = c("0" = "white", "1" = "black"), labels = c("不在场", "在场"), name = "在场状态" ) + # 调整轴标签和主题 labs(x = "观测日期", y = "个体") + theme_bw() + theme( axis.text = element_text(size = 11), legend.position = "bottom" )
效果说明
- Y轴按顺序展示3个个体名称
- X轴刻度为
PresentDay1、PresentDay2两个观测日期 - 状态为1的位置显示实心黑点,状态为0的位置显示带黑色边框的白点
内容的提问来源于stack exchange,提问作者Lola1993
相关产品推荐
相关产品推荐

