r - ggplot2:修复对数色标的图例
问题描述
我正在尝试绘制拟合模型效果ggplot2
作为包返回的图的替代effects
方案,并且我遇到了将连续分组因子映射到scale_color_gradient
. 这些问题源于分组因子具有偏态分布的事实。使用默认颜色映射,大多数颜色彼此无法区分,但是对数转换会混淆图例。我查看了一些相关的 SO 答案(Is there a built-in way to do a logarithmic color scale in ggplot2? , R color scale for logarithmic data? , and Logarithmic color scale in ggplot2 squishes certain legend numbers) t 完全符合要求。
这是我的数据:
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"))
在这里,分组因子PrimeVowelDur
向右倾斜,值为0.03
、0.06
、0.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
应该能够自然地处理p + scale_color_gradient(trans="log")
解决方案而不会弄乱传说。无论如何,我有一个建议的解决方案,但我想看看那里是否有我遗漏的更精明的东西。
解决方案
如果您将基于连续分组因子值的中断传递给 的breaks
和labels
参数scale_color_gradient
,则图例将按预期显示。无论您使用默认颜色条指南还是图例指南,这都有效:
brks2 <- sort(unique(myEffs$PrimeVowelDur))
p + scale_color_gradient(trans="log", breaks=brks2, labels=brks2)
p + scale_color_gradient(trans="log", breaks=brks2, labels=brks2, guide="legend")
推荐阅读
- mysql - 如何将 MySQL 行转换为格式化的 json 对象
- python - Pandas csv不读取阿拉伯字符
- python - 如何使用 numpy 根进行三角函数
- php - 在父类中调用方法是个坏主意吗?
- javascript - Express.js: How do I make a GET request with empty parameters?
- php - 如何插入在无限加载的 WordPress 循环中每 5 个帖子之后?
- spring - Spring SAML:SAMLException:不支持的请求
- iframe - How to utilize external form and retrieve POST data from external form using SuiteScript?
- pug - 从 pug 模板调用 facebook 像素函数
- c# - WPF MVVM 在按钮单击时在视图之间导航