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

R ggplot2对象中存储的比例颜色在哪里?,r,plot,ggplot2,R,Plot,Ggplot2,假设我创建一个绘图: 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')) 该功能的内容包括: function (n) { if (n > length(val

假设我创建一个绘图:

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'))
该功能的内容包括:

function (n) 
{
  if (n > length(values)) {
    stop("Insufficient values in manual scale. ", n, " needed but only ", 
      length(values), " provided.", call. = FALSE)
  }
  values
}
我认为颜色必须存储在
值中,但我不知道它们在
p
中的实际位置


另外,我看到了这个问题:。但就我所要做的而言,我无法构建情节。我需要在它建成之前弄清楚颜色

如果有某种递归搜索
p
字符“红色”或“绿色”的方法,可能有助于找到这些值


编辑:我最终要做的事

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

apply_theme(p) 
…并将颜色方案应用于整个绘图(包括比例、渐变等)。这是为了避免做以下事情:

p + some_theme + scales_colour_manual(values = plot_theme) 
我正试图减少用户的工作量,这样他们就可以将一个主题应用到整个情节中,而不必担心他们是否在绘制渐变、离散比例或其他颜色

建造地块是部分解决方案。但我希望能够应用的主题,仍然能够编辑以后的情节


我已经能够编辑
p
,以便将任何颜色应用于几何图形。但我就是找不到如何用音阶颜色来做到这一点。我知道颜色一定在那里的某个地方

进展不大,但我排除了它可能藏匿的几个地方

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

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

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

# $labels.colour
# [1] "C"
所以它不是直接存储的

通过设置
选项(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)
我们可以搜索调用堆栈中的每一帧,但奇怪的事情正在发生——它似乎不在任何地方

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
reference类使用了一些奇怪的评估技术。

抱歉,我刚才看到您无法构建绘图。因此,我删除了我的答案。你能解释一下为什么不可以构建绘图吗?@Roland添加了一个编辑。也许我完全错了。谢谢你的努力。部分困难来自
p
中的嵌套量。例如,
过滤器(is.character,unlist(p))
只返回三个字符。。。但我知道还有更多(请尝试:
Filter(is.character,unlist(p$scales$scales))
举个例子)<代码>值在
p
中可能不存在。。。这些颜色可能是其他名称。我可能需要一些方法来完全取消列表()。
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