2015-06-25 1 views
1

В следующем примере функция возвращает тему, которая изменяется в некоторой степени (в этом минимальном примере только некоторые крайне уродливые модификации ...). Добавление этой функции в первый раз к ggplot ничего не делает, но добавив его в любой другой сюжет, он работает как intenden. Как я могу убедиться, что функция работает должным образом в первом приложении или где моя ошибка в мышлении?Почему тема создана, возвращенная функцией, отложенной в ее приложении?

require(ggplot2) 

# Minimal example: function returning some theme with modifications 
mytheme <- function(size = 3) { 
    th.my <- theme_set(theme_bw(base_size=size)) 
    th.my$axis.ticks$size = 1 
    return (th.my) 
} 

# Plot something, applying theme function first time 
fig1 <- ggplot(data = mtcars, aes(x = mpg)) + 
     geom_point(aes(y = hp)) + 
     mytheme() 
print(fig1) 

# Now exactly the same, again 
fig2 <- ggplot(data = mtcars, aes(x = mpg)) + 
     geom_point(aes(y = hp)) + 
     mytheme() 
print(fig2) 

Как можно видеть в следующих участках, в первый раз тема не была применена, но во второй раз он работал ...

So far, not working! Now it works...

ответ

1

Это происходит потому, что theme_set изменения по умолчанию для будущих звонков ggplot, он не меняет «текущую» тему. Если вы создаете собственную функцию темы, она должна вернуть список изменений. Не беспокойтесь theme_set. Это должно работать

mytheme <- function(size = 3) { 
    theme_bw(base_size=size) + theme(axis.ticks= element_line(size = 1)) 
} 

ggplot(data = mtcars, aes(x = mpg)) + 
    geom_point(aes(y = hp)) + 
    mytheme() 

Или, если вы хотите эти темы, чтобы применить ко всем будущим участкам, вы бы просто запустить

theme_set(mytheme()) 
ggplot(data = mtcars, aes(x = mpg)) + 
    geom_point(aes(y = hp)) 
# note we don't need to add it to the plot this time since we've 
# set it as the default 
+0

Спасибо, это помогло много! Чтобы понять полный рабочий процесс: во-первых, 'theme_set' меняет тему по умолчанию, но не возвращает что-то полезное. Затем в моей функции я определил некоторые изменения и те, которые были применены правильно. Тем не менее, модификация темы по умолчанию происходит в последующих вызовах 'ggplot', поскольку текущий вызов' ggplot' уже имеет тему по умолчанию. Имеет ли это смысл? – Sosel

Смежные вопросы