ggplot2对象中的比例尺颜色存储在哪里?

3

假设我创建了一个图表:

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中的位置。

附注:我看到了这个问题:如何从ggplot对象中提取填充颜色?。 但是对于我想做的事情,我无法构建图表。 我需要在构建之前获取颜色。

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


编辑:我最终要做的事情。

我正在尝试在绘制图表之前编辑图表。 这个想法是给定一些图表p,你可以像这样做:

apply_theme(p) 

整个图表(包括刻度、渐变等)都会应用一个配色方案。这是为了避免做一些像这样的事情:

p + some_theme + scales_colour_manual(values = plot_theme) 

我正在尝试减少用户的工作量,以便他们可以将主题应用于整个图形,而不必担心是否在着色渐变、离散比例或其他方面。建立图形是部分解决方案。但我希望能够应用主题,仍然能够编辑图形。我已经能够编辑p,以便无论何时都会追溯地应用颜色到geoms。但我就是找不到如何使用比例颜色来实现这一点。我知道颜色肯定在其中某个地方!

抱歉,我刚看到您无法构建图表。因此,我删除了我的答案。您能解释一下为什么无法构建图表吗? - Roland
@Roland 添加了一个编辑。也许我完全走错了路。 - Ciarán Tobin
2个回答

3

虽然没有太多进展,但我已经排除了一些可能隐藏它的地方。

你可以使用以下命令查看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)) 仅作为示例)。valuesp 中可能不存在...颜色可能在其他名称下。我可能需要一些方法来完全 unlist() p - Ciarán Tobin

0
g <- ggplot_build(p)
data.frame(colours = unique(g$data[[1]]["colour"]),
             label = g$plot$scales$scales[[1]]$get_labels())

您将在此处看到颜色图例数据框:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接