【问题标题】:Where are the scale colours stored in a ggplot2 object?ggplot2 对象中存储的比例颜色在哪里?
【发布时间】:2012-12-22 04:42:30
【问题描述】:

假设我创建了一个情节:

df <- data.frame(A = 1:100, B = jitter(1:100, 25), C = c('One', 'Two'))

p <- ggplot(df, aes(A, B, colour = C)) + 
  geom_point() + 
  scale_colour_manual(values = c('red', 'green'))

p 中存储的这些颜色(红色和绿色)在哪里?


我可以在这里看到函数中使用的函数调色板:
p$scales$scales[[1]]$palette

这个函数的内容是:

function (n) 
{
  if (n > length(values)) {
    stop("Insufficient values in manual scale. ", n, " needed but only ", 
      length(values), " provided.", call. = FALSE)
  }
  values
}

我认为颜色必须存储在values 中,但我不知道它们实际上在p 中的什么位置。


附:我见过这个问题:How to extract the fill colours from a ggplot object?。但是对于我正在尝试做的事情,我无法构建情节。我需要在它建成之前得到颜色。

如果有某种方法可以递归搜索p 中的字符“red”或“green”,这可能有助于找到这些值。


编辑:我最终想要做什么。

我正在尝试在绘图之前对其进行编辑。这个想法是给定一些情节p 你可以做这样的事情:

apply_theme(p) 

...颜色方案应用于整个绘图(包括比例、渐变等)。这是为了避免必须执行以下操作:

p + some_theme + scales_colour_manual(values = plot_theme) 

我试图减少用户的工作量,以便他们可以将主题应用于整个情节,而不必担心他们是否正在为渐变、离散比例或其他内容着色。

构建情节是部分解决方案。但我希望能够应用主题并且以后仍然能够编辑情节。

我已经能够编辑p 以便追溯应用到几何图形的任何颜色。但我就是找不到如何用刻度颜色来做到这一点。我知道颜色一定在某处!

【问题讨论】:

  • 对不起,我刚刚看到你无法构建情节。因此,我删除了我的答案。你能解释一下为什么不能选择构建情节吗?
  • @Roland 添加了编辑。也许我的做法完全错误。

标签: r plot ggplot2


【解决方案1】:

进展不大,但我已经排除了它可能隐藏的几个地方。

你可以看到p包含的所有字符向量

Filter(is.character, unlist(p))
# $labels.x
# [1] "A"

# $labels.y
# [1] "B"

# $labels.colour
# [1] "C"

所以它不是直接存储的。

通过设置options(error = recover),然后只提供一种颜色来强制出错,我们可以检查调用堆栈。

(p <- ggplot(df, aes(A, B, colour = C)) + 
  geom_point() + 
  scale_colour_manual(values = 'red')
)

 1: print(list(data = list(A = 1:100, B = c(4.32692646654323, 3.46481398493052, 0.4989527114667, 
...
13: scale$palette(n)

进入框架13: scale$palette(n),可以看到变量values确实存储了颜色信息。

Browse[1]> values
[1] "red"

我们可以搜索调用堆栈中的每一帧,但奇怪的事情正在发生 - 它似乎不在任何地方。

Browse[1]> sapply(
  sys.frames(), 
  function(envir) 
  {
    exists("values", envir, inherits = FALSE)
  }
)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[16] FALSE FALSE

(有关调用堆栈的完整详细信息,请参阅sys.status()。)

我怀疑Scales 引用类使用了一些奇怪的评估技术。

【讨论】:

  • +1 感谢您的努力。部分困难来自p 中的嵌套数量。例如。 Filter(is.character, unlist(p)) 只返回三个字符......但我知道事实上还有更多(尝试:Filter(is.character, unlist(p$scales$scales)) 仅作为示例)。 values 可能不存在于 p... 颜色可能使用其他名称。我可能需要一些方法来完全unlist()p
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 2021-03-17
  • 2012-02-24
  • 1970-01-01
  • 2023-04-04
  • 2016-03-13
  • 2017-03-19
  • 1970-01-01
相关资源
最近更新 更多