Base R中ifelse实现条件颜色失效问题求助
看起来你遇到的问题核心在于 stripchart 在 method="stack" 模式下的颜色参数处理逻辑,或者是运行代码时 round_to 变量的值发生了意外变化,我们一步步拆解:
一、先确认核心矛盾点
你单独执行条件判断时得到了包含 TRUE 的结果,说明理论上颜色向量 col_vec 应该包含 "red",但图表全绿,这意味着要么:
- 实际运行
stripchart时,round_to的值和你测试条件时不一样,导致所有转换后的x值都不大于0; stripchart在堆叠模式下对颜色向量的处理和你预期的不同。
1. 先排查 round_to 变量的一致性
这是最容易被忽略的点:你测试条件判断时用的 round_to,和运行 stripchart 时的 round_to 可能不是同一个值。比如你测试时用 round_to=50,但运行图表时不小心改成了 round_to=1000,那所有小于1000的正数都会被四舍五入为0,导致条件全为 FALSE,颜色全绿。
验证方法:在 stripchart 代码前添加两行打印,确认转换后的x值和颜色向量:
x_transformed <- round(df$pnl_act / round_to, 0) * round_to col_vec <- ifelse(x_transformed > 0, "red", "green") print(x_transformed) # 看是否有正数 print(col_vec) # 看是否有"red"
如果这里的 col_vec 全是 "green",那就是 round_to 的值出了问题,调整回你测试时的数值即可。
2. 解决 stripchart 堆叠模式的颜色分配问题
如果上面的验证显示 col_vec 确实包含 "red",但图表还是全绿,那就是 stripchart 在 method="stack" 下的颜色逻辑导致的:
默认情况下,stripchart 会把相同x值的点归为一组,然后用颜色向量中该组第一个点的颜色作为整组的颜色。如果某个正数x值的组里,第一个点对应的颜色是绿色(比如原始数据中该x值的第一个点是负数转换来的?不可能,但不排除排序问题),整组都会变成绿色。
解决方案:绕过 stripchart 的默认颜色逻辑,手动添加每个点
我们先绘制空的图表框架,再用 points() 函数逐个添加点并指定颜色,同时手动计算堆叠的y坐标:
# 计算转换后的x值 x_transformed <- round(df$pnl_act / round_to, 0) * round_to # 计算每个x值的堆叠位置(相同x值的点依次向上堆叠) stack_pos <- unlist(tapply(seq_along(x_transformed), x_transformed, function(x) seq_along(x))) # 绘制空的stripchart框架(颜色设为NA,不显示默认点) stripchart( x_transformed, xlim=c(-2500,2500), pch=20, method="stack", xaxt="n", main=paste("Act", pp1[[1]], pp2[[1]], pp3[[1]], threshold_vector[1], sep="-"), col=NA ) # 手动添加每个点,指定对应颜色 points( x_transformed, stack_pos, pch=20, col=ifelse(x_transformed > 0, "red", "green") )
这种方式能确保每个点都使用你指定的颜色,不受堆叠分组的影响。
二、额外补充:你的转换逻辑小优化
你重复写了两次 round(df$pnl_act / round_to, 0) * round_to,可以提前赋值给变量,让代码更简洁且避免计算错误:
x_transformed <- round(df$pnl_act / round_to, 0) * round_to # 后续直接用x_transformed即可
内容的提问来源于stack exchange,提问作者rollback

