ggplot2:修复对数色标的图例

时间:2018-08-10 00:19:10

标签: r ggplot2

我正在尝试在ggplot2中绘制拟合模型效果,以替代effects包返回的图,并且在将连续分组因子映射到{{ 1}}。这些问题源于分组因子具有偏斜分布的事实。使用默认的颜色映射,大多数颜色是无法区分的,但是对数转换会混淆图例。我查看了一些不太适合的相关SO答案(Is there a built-in way to do a logarithmic color scale in ggplot2?R colour scale for logarithmic data?Logarithmic color scale in ggplot2 squishes certain legend numbers)。

这是我的数据:

scale_color_gradient

在这里,分组因子myEffs <- structure(list(PrimeShiftIndex = c(-4, -0.2, 4, -4, -0.2, 4, -4, -0.2, 4, -4, -0.2, 4), PrimeVowelDur = c(0.03, 0.03, 0.03, 0.06, 0.06, 0.06, 0.09, 0.09, 0.09, 1.59, 1.59, 1.59), fit = c(-0.184306629528313, -0.164313919815862, -0.142216714344205, -0.200749305969527, -0.178039844592615, -0.152939913597082, -0.210367655099129, -0.186068995874736, -0.159212583047775, -0.278488972243709, -0.242934925102426, -0.203638346683111), se = c(0.0437103286485701, 0.0342751848548937, 0.0446524040373885, 0.0417352317881704, 0.0340007746839495, 0.042093900962637, 0.0441609220226782, 0.0341565687974652, 0.0442166991273061, 0.0995662189943997, 0.041203801253227, 0.0993299532144987 ), lower = c(-0.269979086288845, -0.231493448847753, -0.229735643449126, -0.282550563276701, -0.24468152835471, -0.235444164230796, -0.296923277064622, -0.253016036857112, -0.245877528409642, -0.473639245768052, -0.323694575976204, -0.398325538129639 ), upper = c(-0.0986341727677806, -0.0971343907839703, -0.0546977852392849, -0.118948048662354, -0.11139816083052, -0.0704356629633676, -0.123812033133635, -0.119121954892359, -0.0725476376859078, -0.0833386987193667, -0.162175274228647, -0.00895115523658357 )), class = "data.frame", row.names = c(NA, -12L), .Names = c("PrimeShiftIndex", "PrimeVowelDur", "fit", "se", "lower", "upper")) 向右偏,其值为PrimeVowelDur0.030.060.09。这是获得可区分的颜色和可读图例的一些失败尝试(用令人讨厌的粗线突出显示颜色对比或缺乏对比)。

1.59

我的直觉是p <- ggplot(myEffs, aes(x=PrimeShiftIndex, y=fit, group=PrimeVowelDur, color=PrimeVowelDur)) + geom_line(size=6) ##Legend fine but line colors indistinguishable p ##Missuse's suggestion yields the same issue p + scale_color_gradientn(colors = colorRampPalette(colors = c("#132B43", "#56B1F7"))(nrow(myEffs)), values = scales::rescale(log(sort(myEffs$PrimeVowelDur)))) ##Colors distinguishable but legend messed up p + scale_color_gradient(trans="log") ##Using trans="log" with pre-defined breaks as per Gregor doesn't make legend much better brks <- seq(0, 1.6, length.out=5) p + scale_color_gradient(trans="log", breaks=brks, labels=brks) ##Nor does S Rivero's suggestion p + scale_color_gradient(trans="log", breaks=brks, labels=brks, guide="legend") 应该能够自然地处理ggplot解决方案而不会弄乱图例。无论如何,我有一个建议的解决方案,但是我想看看是否有任何我想念的东西。

1 个答案:

答案 0 :(得分:1)

如果您基于连续分组因子的值将中断传递给breaks的{​​{1}}和labels参数,则图例将按预期显示。无论您使用默认的颜色栏指南还是图例指南,该方法均有效:

scale_color_gradient