随机选择ggtheme

时间:2019-02-01 12:38:51

标签: r ggplot2 plot themes

我想绘制一个带有随机主题的ggplot(实际上,我想绘制许多图,每个图都有不同的主题)。考虑以下可重现的示例:

# Exmple data
df <- data.frame(x = 1:10, y = 1:10)

# Select theme randomly
random_theme <<- sample(c("theme_gray", "theme_bw", "theme_light", "theme_dark", "theme_minimal", "theme_classic"), 1)

# Draw ggplot
ggplot(df, aes(x, y)) +
  geom_line() +
  random_theme            # This line does not work

问题:如何随机选择一个ggtheme?

3 个答案:

答案 0 :(得分:11)

从功能而非功能名称中采样。此外,样品从收益以外的任何一个标量更复杂的采样时的列表,所以您需要的第一个列表元素。例如:

> sample(c(sqrt, sqrt),2)
[[1]]
function (x)  .Primitive("sqrt")

[[2]]
function (x)  .Primitive("sqrt")

因此,请使用以下随机主题功能:

random_theme <- sample(c(theme_gray, theme_bw, theme_light, theme_dark, theme_minimal, theme_classic), 1)[[1]]

并在绘制时调用它:

ggplot(df, aes(x, y)) +geom_line() + random_theme()

重新采样random_theme并再次绘图以更新。

此外,您可能不需要<<-,我想这是从拼命尝试使某些事情正常工作而造成的困扰...

答案 1 :(得分:6)

您可以使用match.fun()进行此操作:

random_theme = match.fun(sample(c("theme_gray", "theme_bw", "theme_light", "theme_dark", "theme_minimal", "theme_classic"), 1))

ggplot(df, aes(x, y)) +
 geom_line() +
 random_theme()

答案 2 :(得分:2)

SICE您的random_themecharacter矢量,可以使用eval,然后parse解析您的主题。

library(tidyverse)

ggplot(df, aes(x, y)) +
  geom_line() +
  eval(parse(text = paste0(random_theme, "()")))

或更直接地:

ggplot(df, aes(x, y)) +
  geom_line() +
  eval(parse(text = paste0(sample(c("theme_gray",
                                    "theme_bw", 
                                    "theme_light", 
                                    "theme_dark", 
                                    "theme_minimal", 
                                    "theme_classic"), 1)  , "()")))