检查或替换参数的值";调色板“;在函数ggplot2::discrete_scale()中?

检查或替换参数的值";调色板“;在函数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

事先我想为我的英语不好道歉

我定义了命名的自定义调色板,并希望在使用函数ggplot()创建绘图时使用自建函数轻松调用它们。因此,我编写了一个“scale_function()”,它只需要3个参数:

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)要少。这意味着n palette_catalog是一个列表,“palette_x”包括6种不同的颜色作为十六进制代码

palette_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"