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

使用MixedPsy包PsychShape绘制渐变色心理测量曲线遇阻求助

解决MixedPsy包PsychShape曲线渐变颜色不生效的问题

问题根源

PsychShape生成的ggplot曲线使用固定颜色,未将颜色美学(color)与x轴的DT变量绑定,导致scale_color_gradient找不到对应的映射关系,因此被直接忽略。

解决方案

方法一:手动基于PsychShape的数据重绘曲线

先提取PsychShape生成的数据集,再手动构建ggplot对象并指定颜色映射:

library(MixedPsy)
library(ggplot2)

# 获取心理测量曲线的原始数据
psy_data <- PsychShape(
  pse = MixDelta(model1)[1,1], 
  jnd = MixDelta(model1)[2,1], 
  x.range = c(-2,2), 
  ps.link = c("probit"), 
  ps.size = 2
)$data

# 手动绘制带颜色渐变的曲线
ggplot(psy_data, aes(x = x, y = y, color = x)) +
  geom_line(size = 2) +
  scale_color_gradient(name = "DT", low = "blue", high = "red") +
  scale_x_continuous(breaks = c(-2,-1.5,-1,-0.5,0,0.5,1,1.5,2)) +
  labs(
    title = "Psychometric Curve", 
    x = "DT = T.target - T.reference [ °C]", 
    y = "Prob. answer 'warmer'"
  ) +
  theme(
    title = element_text(size = 23),
    axis.text = element_text(size=23),
    legend.text = element_text(size=21)
  )

方法二:修改原ggplot对象的图层映射

直接修改PsychShape返回的ggplot对象,给曲线图层添加颜色映射:

library(MixedPsy)
library(ggplot2)

# 保存原始plot对象
p <- PsychShape(
  pse = MixDelta(model1)[1,1], 
  jnd = MixDelta(model1)[2,1], 
  x.range = c(-2,2), 
  ps.link = c("probit"), 
  ps.size = 2
)

# 给曲线图层添加color与x变量的映射
p$layers[[1]]$mapping <- aes(x = x, y = y, color = x)

# 添加渐变颜色及其他样式设置
p +
  scale_color_gradient(name = "DT", low = "blue", high = "red") +
  scale_x_continuous(breaks = c(-2,-1.5,-1,-0.5,0,0.5,1,1.5,2)) +
  labs(
    title = "Psychometric Curve", 
    x = "DT = T.target - T.reference [ °C]", 
    y = "Prob. answer 'warmer'"
  ) +
  theme(
    title = element_text(size = 23),
    axis.text = element_text(size=23),
    legend.text = element_text(size=21)
  )

原理说明

scale_color_gradient是用于映射连续变量到颜色渐变的标度,必须配合aes(color = 连续变量)使用才能生效。原代码中没有将曲线颜色与x变量绑定,因此该标度无法找到作用对象,最终被ggplot忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:22:40