我正在尝试为一组模型的准确性创建一个图,这些模型的两个参数组合不同。任何模型的准确度都不会超过 0.98,并且大多数模型的准确度在 0.94 到 0.98 之间(顺便说一句,这只是实践,没有真正的研究)。我发现使用scale_color_viridis_c()
withlimits = c(.96, .98)
并values = c(.25, 1)
产生一个很好的渐变,可以很好地可视化精度分布,但是这样我不能让 color_bar 上升到 1 - 它以 0.98 结束。
我的第一种方法是设置limits = c(0.96, 1)
and values = c(.125, 0.5)
,但这会导致高于 0.98 的每个值都注册为 NA,与低于 0.96 的值相同。然后我尝试将第一个图与与第一个相同的第二个图分层,但将数据点着色为精度 > 0.98 黑色(即没有)并“填充”上部的 NA(即 0.98 到 1)第一个带有黑色的 color_bar,并且所有内容都较低透明。
我创建了一个示例:
library(ggplot2)
library(ggnewscale)
set.seed(123)
# variable 1
v1 <- numeric()
for (i in 1:50) {
v1 <- c(v1, rep(i, 56))
}
# variable 2
v2 <- rep(seq(50, 600, 10), 50)
# creating preliminary df
df <- data.frame(v1 = v1, v2 = v2)
# creating mock accuracy data
acc <- apply(df, 1, function(x) {
temp_acc <- runif(1, 1, 10) * x[1]^0.6 / x[2]^0.65 * -1
})
acc <- (-1 * (acc / (10 * min(acc)))) - runif(1, -0.01, 0.01) + 0.99
acc <- acc - (max(acc) - 0.98) - 0.0005
#create complete df
df$acc <- acc
#plotting
g <- ggplot(data = df, aes(x = v1, y = v2, color = acc)) +
geom_point() + scale_color_viridis_c(values = c(.125, 0.5), na.value = "grey80",
breaks = seq(0.96, 1, 0.005), limits = c(0.96, 1),
guide = guide_colorbar(barheight = 10)) +
new_scale_color() +
geom_point(aes(color = acc), alpha = 0.2) +
scale_color_gradientn(colors = "black",
values = c(0.5, 1), na.value = NA,
breaks = seq(0.96, 1, 0.005), limits = c(0.96, 1),
guide = guide_colorbar(barheight = 10))
g
这几乎完全符合我的要求 - 情节部分很完美,但我希望将两个 color_bars 合并为一个。有没有办法做到这一点?或者从不同的角度来处理它:有没有办法为连续色标设置两个阈值,并让高于/低于这些阈值的数据通过组合的 color_bar 以不同的颜色着色?
这只是出于美观的原因,我可以使用图像编辑软件甚至 MSPaint 轻松完成这项任务,但我希望能够仅根据我的数据在 R 中完成这一切,而不是人工编辑。
提前致谢!
大卫