检查或替换参数的值";调色板“;在函数ggplot2::discrete_scale()中?
事先我想为我的英语不好道歉 我定义了命名的自定义调色板,并希望在使用函数ggplot()创建绘图时使用自建函数轻松调用它们。因此,我编写了一个“scale_function()”,它只需要3个参数:检查或替换参数的值";调色板“;在函数ggplot2::discrete_scale()中?,r,ggplot2,colors,R,Ggplot2,Colors,事先我想为我的英语不好道歉 我定义了命名的自定义调色板,并希望在使用函数ggplot()创建绘图时使用自建函数轻松调用它们。因此,我编写了一个“scale_function()”,它只需要3个参数: type (character. "color" or "fill" for aesthetic mapping) palette (character. Name of an available palette) discrete (logical. TRUE for d
type (character. "color" or "fill" for aesthetic mapping)
palette (character. Name of an available palette)
discrete (logical. TRUE for discrete data and FALSE for continuous data)
在第二个函数的帮助下,我使用(grDevices::)colorRampPalette()对调色板的给定颜色进行插值
到目前为止,一切都按计划顺利进行。现在我在使用我的函数时注意到一个非常具体的问题:
pal_domains <- brewer.pal(name = "Set3", n = 12)
pal_function <- colorRampPalette(pal_domains)
ggplot(iris, aes(Sepal.Width, Sepal.Length, color = Species)) +
geom_point() +
scale_color_manual(values = pal_function(3))
假设我们想要创建一个绘图,其中我们需要的颜色(n)比我选择的调色板(c)实际拥有的颜色(n)要少。这意味着npalette_catalog[["palette_x"]]
# [1] "#d11141" "#00b159" "#00aedb" "#f37735" "#ffc425" "#cccccc"
情节
用于绘图的实际颜色不正确:
正如在开始时已经提到的,绘图使用第一个、中间(插值)和最后一个颜色值
"#d11141",
"#799288",
"#cccccc
如您所见,第二个颜色值无效,因为它是插值的结果,并且与“palete_x”的实际第二个值不匹配,该值应为“#00b159”
此外,第三个颜色值也是未请求的。相反,应该选择实际的第三个值,即“#00aedb”
我真的希望有人能帮我找到解决办法!我肯定有一个
我尝试了几种解决方案,但都不奏效
正如我已经说过的,代码工作得很好。只是这个小小的特殊案例让我很痛苦,R在这一点上让我发疯。。。因为没有什么能像我期望的那样起作用
我将感谢你的帮助和支持 请原谅我的误解,但我相信您仍然可以使用
colorRampPalette()
,但作为一种功能:
pal_domains <- brewer.pal(name = "Set3", n = 12)
pal_function <- colorRampPalette(pal_domains)
ggplot(iris, aes(Sepal.Width, Sepal.Length, color = Species)) +
geom_point() +
scale_color_manual(values = pal_function(3))
pal_domains我想下面的内容大概能告诉你我认为你在寻找什么。我们只需在函数中编写一个新函数,当n非常感谢您的解决方案时,它将返回第一个1:n值!我马上实现了palfun(),但如果我执行ggplot(iris,…),我会收到一条奇怪的警告消息:“警告消息:删除了150行,其中包含缺少的值(geom_point)。”它显示一个空的绘图,只有轴和标签,但没有任何geom参数或颜色。。。为什么我会收到这个警告?这意味着什么?函数返回的颜色可能是NAs,这将给出错误消息。我已经在另一台计算机上重新运行了代码,但它不会为我抛出任何错误消息。你确定你已经在scale_函数()内部实现了palfun()而不是在外部实现了吗?我还用这里发布的代码摘录重新运行了代码。它确实有效!但在我稍微扩展的原始版本中,出现了上述警告消息。。。所以我的附加代码中有一些错误引起了这个警告。。。是的,我已经在scale_函数中实现了palfun()。。。是否有可能与您分享(或发送)我的全部代码?我应该把它贴在这里作为答案吗?对不起,这些愚蠢的问题,我是新手…没关系!我找出了问题的根源。我必须取消命名()我的单个命名列表组件。对于每个调色板,我也为调色板中的每一种颜色命名。例如:base\u颜色再次感谢您的支持!我真的很感激。没问题,请随意标记为正确:)祝你好运!
"#d11141",
"#799288",
"#cccccc
pal_domains <- brewer.pal(name = "Set3", n = 12)
pal_function <- colorRampPalette(pal_domains)
ggplot(iris, aes(Sepal.Width, Sepal.Length, color = Species)) +
geom_point() +
scale_color_manual(values = pal_function(3))
scale_function <- function(type = "color", palette = "palette_x", discrete = TRUE, ...) {
pal <- interpolate(palette)
palfun <- function(n) {
if (n > length(palette_catalog[[palette]])) {
return(pal(n))
} else {
return(palette_catalog[[palette]][seq_len(n)])
}
}
if(type == "color") {
if(discrete) {
discrete_scale("color", palette,
palette = palfun,
...)
} else {
scale_color_gradientn(colors = pal(count), ...)
}
}
}
g <- ggplot(iris, aes(Sepal.Width, Sepal.Length, color = Species)) +
geom_point() +
scale_function(palette = "palette_x")
g
unique(layer_data(g)[["colour"]])
[1] "#d11141" "#00b159" "#00aedb"
df <- iris
# Random discrete variable
df$catvar <- sample(LETTERS[1:10], size = 150, replace = T)
g2 <- ggplot(df, aes(Sepal.Width, Sepal.Length, color = catvar)) +
geom_point() +
scale_function(palette = "palette_x")
unique(layer_data(g2)[["colour"]]) # Not in right order due to random sampling
[1] "#FDBB26" "#00B067" "#BC8359" "#00AFAF" "#E8C76F" "#CCCCCC" "#D11141" "#F6902F" "#5C694E" "#35A1B6"