gpt4 book ai didi

r - 设置文档持久化 ggplot2 颜色主题

转载 作者:行者123 更新时间:2023-12-01 14:23:51 25 4
gpt4 key购买 nike

我想为 Markdown 文档中构建的每个绘图定义一个调色板。本质上,这将覆盖默认选择。

有几个非常古老的答案——感谢链接herehere@dww 建议- 解决旧版本(特别是在现代发布几个主要版本时在 0.8.2 上调用解决方案,目前为 3.2.x)。

我将说明最接近的用例,设置主题。对于通用主题,这是微不足道的:而不是附加 + theme_minimal()在每个情节上,我都可以设置贯穿所有情节的主题。

library(ggplot2) 

d <- diamonds[sample(1:nrow(diamonds), 1000), ]

## without theming
ggplot(d, aes(x=carat, y=price, color=clarity)) +
geom_point() +
theme_minimal() # must set this theme call for every plot

## setting theme
theme_set(theme_minimal())

ggplot(d, aes(x=carat, y=price, color=clarity)) +
geom_point() # plot in theme, for all subsequent plots

是否存在类似的修改来设置整个调色板?例如,基于主题的调用替换,
ggplot(d, aes(x=carat, y=price, color=clarity)) + 
geom_point() +
scale_color_brewer(palette='Set2') # requesting a global option to set this for all plots

linked solution这不依赖于旧版本,而是重载了整个 ggplot 函数。这似乎有风险。
ggplot <- function(...) ggplot2::ggplot(...) + scale_color_brewer(palette = 'Set1')

最佳答案

有一个ggplot_global ggplot2 内部使用的环境但不导出。您可以通过暂时解锁 ggplot 函数的绑定(bind)并对其进行修改以将环境的内容作为列表返回来查看其结构。您可以像这样非破坏性地执行此操作:

library(ggplot2)

get_ggplot_global <- function()
{
unlockBinding("theme_set", as.environment("package:ggplot2"))
backup <- body(theme_set)[[5]]
body(theme_set)[[5]] <- substitute(return(as.list(ggplot_global)))
global_list <- theme_set(theme_bw())
body(theme_set)[[5]] <- backup
lockBinding("theme_set", as.environment("package:ggplot2"))
return(global_list)
}

global_list <- get_ggplot_global()
names(global_list)
#> [1] "date_origin" "element_tree" "base_to_ggplot" "all_aesthetics"
#> [5] "theme_current" "time_origin"

通过检查这个,你可以看到 ggplot 全局环境有一个名为 theme_current 的对象。 ,这就是为什么您可以全局设置各种线条、文本和轴元素,包括它们的颜色。

当您在问题中谈论配色方案时,您指的是在比例对象中定义的颜色。这不是 ggplot_global 环境的一部分,您不能更改默认比例对象,因为没有。当你创建一个新的 ggplot() ,它有一个用于“秤”的空槽。

因此,您有几个选择:
  • my_ggplot <- function(...) ggplot2::ggplot(...) + scale_color_brewer() 包裹 ggplot
  • 用上述函数覆盖 ggplot(如@Phil 所建议)
  • 使用标准 ggplot 语法创建您自己的主题对象

  • 最好的办法可能是只为 ggplot 编写一个包装器。但是,第三个选项也非常干净和惯用。你可以像这样实现它:

    set_scale <- function(...)
    {
    if(!exists("doc_env", where = globalenv()))
    assign("doc_env", new.env(parent = globalenv()), envir = globalenv())
    doc_env$scale <- (ggplot() + eval(substitute(...)))$scales$scales[[1]]
    }

    my_scale <- function() if(exists("doc_env", where = globalenv())) return(doc_env$scale)

    您可以通过这样做来使用它(例如)
    set_scale(scale_color_brewer(palette = "Set2"))


    在文档的开头。
    所以现在你可以做 + my_scale()对于每个地 block :
    d <- diamonds[sample(1:nrow(diamonds), 1000), ]

    ggplot(d, aes(x=carat, y=price, color=clarity)) +
    geom_point() +
    my_scale()

    enter image description here

    关于r - 设置文档持久化 ggplot2 颜色主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60133210/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com