R语言 用户自定义函数将主题应用于多个情节- s3情节主题

fumotvh3  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(145)

我想有一个导出函数my_theme(),可以应用于不同的图表类型(ggplot,highcharter,plotly)。我尝试使用S3方法,但有几个问题:

  • 我只能弄清楚如何使用管道|>+操作符来处理ggplot对象
  • 我似乎不能在ggplot2::theme_set()中使用它,我可能会创建一个单独的use_my_theme()函数来完成此操作

任何建议将不胜感激:

library(highcharter)
library(ggplot2)

# functions
my_theme <- function(p, ...) {
  UseMethod("my_theme", p)
}

my_theme.gg <- function(p, ...) {
  p + 
    theme_dark(...)
}

my_theme.highchart <- function(p, ...) {
  p |> 
    hc_add_theme(hc_theme_darkunica(...))
}

# highcharter
highcharter::highcharts_demo() |> 
  my_theme()

# ggplot
ggplot2::qplot(mpg, wt, data = mtcars) |> 
  my_theme()                        # ^^^ how to make '+' instead?

theme_set(my_theme())   # doesn't work (and future plots will fail)
theme_set(theme_gray()) # revert back
bgtovc5b

bgtovc5b1#

我自己也没有弄明白,但是添加一个missing()条件就可以了。如果有ggplot2和另一个用操作符+而不是管道|>构建的绘图库,这个方法就不起作用了。

library(highcharter)
library(ggplot2)

# methods
my_theme <- function(p, ...) {
  if (missing(p)) {
    return(theme_dark(...))
  }
  
  UseMethod("my_theme", p)
}

my_theme.gg <- function(p, ...) {
  p + theme_dark(...)
}

my_theme.highchart <- function(p, ...) {
  p |> hc_add_theme(hc_theme_darkunica(...))
}

# highcharter
highcharts_demo() |> my_theme()

# ggplot
gg <- quickplot(group, weight, data = PlantGrowth, color = group) 

gg |> my_theme()

theme_set(my_theme())
gg

theme_set(theme_gray())
gg

相关问题