说我创建了一个情节:
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
的实际位置。
P.S。我见过这个问题:How to extract the fill colours from a ggplot object?。但是对于我正在尝试做的事情,我无法建立情节。我需要在它构建之前获得颜色。
如果有某种方式递归搜索p
字符“红色”或“绿色”,可能有助于找到这些值。
我正在尝试在绘制之前编辑绘图。想法是给定一些情节p
你可以做这样的事情:
apply_theme(p)
...并且颜色方案应用于整个图(包括比例,渐变等)。这是为了避免做以下事情:
p + some_theme + scales_colour_manual(values = plot_theme)
我正在努力减少用户的工作量,以便他们可以将主题应用于整个情节,而不必担心他们是否着色渐变,离散比例或其他什么。
构建情节是部分解决方案。但我希望能够应用主题,以后仍然可以编辑该情节。
我已经能够编辑p
,以便回溯地将任何颜色应用于geoms。但我只是找不到如何用比例颜色做到这一点。我知道颜色必须在某处!
答案 0 :(得分: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
引用类一起使用。