我想绘制一个带有随机主题的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?
答案 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_theme
是character
矢量,可以使用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) , "()")))