You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言visreg结合ggplot2绘图如何自定义jitter宽度避免点重复绘制

问题描述

使用R语言的visreg、ggplot2包绘制体长与驯化温度的关联关系图时,温度变量仅包含23℃、28℃两个取值。为避免所有散点落在同一条竖线上,需要为散点添加抖动(jitter)效果,但调用visreg()时设置jitter = TRUE参数后,默认抖动宽度过大。
先后尝试三种实现方式,均未达到预期效果:

  • 方式1:直接在visreg()中开启jitter = TRUE生成图p1,代码如下:
library(ggplot2)
library(visreg)

p1 <- visreg(m,"a_temp",by="ploisex", overlay=TRUE, jitter = TRUE, gg=TRUE) + 
  xlab("Acclimation temperature (°C)") +
  ylab("Log final length") + ylim(2.8,3.4) +
  scale_fill_manual(name = "Ploidy level/sex", values = c("2n f" = "blue", "2n m" = "lightblue", "3n m" = "red")) + 
  scale_colour_manual(name = "Ploidy level/sex", values = c("2n f" = "blue", "2n m" = "lightblue", "3n m" = "red")) +
  theme_bw()

p1

该代码生成的图表抖动宽度过宽,不符合需求。

  • 方式2:关闭visreg自带jitter参数,叠加geom_jitter(width = .1)尝试自定义抖动宽度生成图p2,代码如下:
p2 <- visreg(m,"a_temp",by="ploisex", overlay=TRUE, gg=TRUE) + 
  geom_jitter(width = .1) +
  #geom_jitter(width = .1, aes(color=ploisex)) +
  xlab("Acclimation temperature (°C)") +
  ylab("Log final length") + ylim(2.8,3.4) +
  scale_fill_manual(name = "Ploidy level/sex", values = c("2n f" = "blue", "2n m" = "lightblue", "3n m" = "red")) + 
  scale_colour_manual(name = "Ploidy level/sex", values = c("2n f" = "blue", "2n m" = "lightblue", "3n m" = "red")) + 
  theme_bw()

p2

该代码虽可调整抖动宽度,但出现散点重复绘制的问题。

  • 方式3:同时开启visreg的jitter=TRUE参数并叠加geom_jitter(width = .1)生成图p3,代码如下:
p3 <- visreg(m,"a_temp",by="ploisex", overlay=TRUE, jitter = TRUE, gg=TRUE) + 
  geom_jitter(width = .1) +
  #geom_jitter(width = .1, aes(color=ploisex)) +
  xlab("Acclimation temperature (°C)") +
  ylab("Log final length") + ylim(2.8,3.4) +
  scale_fill_manual(name = "Ploidy level/sex", values = c("2n f" = "blue", "2n m" = "lightblue", "3n m" = "red")) + 
  scale_colour_manual(name = "Ploidy level/sex", values = c("2n f" = "blue", "2n m" = "lightblue", "3n m" = "red")) + 
  theme_bw()

p3

该代码既没有成功调整抖动宽度,也依然存在散点重复绘制的问题。
需要找到可自定义jitter宽度、同时不会出现散点重复绘制的可行方法。

解决方案

散点重复绘制的原因很简单:visreg(gg=TRUE)返回的ggplot对象本身已经包含了一层原始散点图层,后续再叠加geom_jitter()相当于在原有散点上又画了一遍点,必然会出现重复。
按以下步骤操作即可实现自定义抖动宽度且无重复散点:

  1. 调用visreg()时关闭自带jitter参数,生成基础图对象
  2. 移除基础图中自带的原始散点图层
  3. 新增自定义宽度的抖动散点图层,匹配原有的配色映射即可

参考代码:

library(ggplot2)
library(visreg)

# 生成不带抖动的基础visreg图
p_base <- visreg(m,"a_temp",by="ploisex", overlay=TRUE, jitter = FALSE, gg=TRUE)

# 移除自带的原始散点图层:visreg的散点为GeomPoint类型,默认在第2层
# 若不确定图层位置,可运行下行代码查看所有图层类型,找到GeomPoint对应的序号即可
# sapply(p_base$layers, function(x) class(x$geom)[1])
p_base$layers[[2]] <- NULL

# 添加自定义宽度的抖动散点,调整width参数即可控制抖动幅度
p_final <- p_base +
  geom_jitter(width = 0.1, aes(color = ploisex, fill = ploisex)) +
  xlab("Acclimation temperature (°C)") +
  ylab("Log final length") + 
  ylim(2.8,3.4) +
  scale_fill_manual(name = "Ploidy level/sex", values = c("2n f" = "blue", "2n m" = "lightblue", "3n m" = "red")) + 
  scale_colour_manual(name = "Ploidy level/sex", values = c("2n f" = "blue", "2n m" = "lightblue", "3n m" = "red")) +
  theme_bw()

p_final

width参数可以根据实际展示效果调整,常用取值范围在0.05~0.15之间,数值越小抖动幅度越窄。


内容的提问来源于stack exchange,提问作者Iris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:12:32