Копирование и изменение темы по умолчанию - PullRequest
30 голосов
/ 18 сентября 2011

Я хотел бы создать новую тему для ggplot, основанную на theme_bw().

Я предполагаю, что необходимы следующие шаги (в псевдокоде):

  1. Сделайте копию theme_bw (): theme_new() <- theme_bw()
  2. Изменить копию: theme_update(axis.title.x = theme_text(family = base_family, size = base_size, vjust = 0.5))

Любой совет о том, как это осуществить, будет очень признателен!


Редактировать: @ Андри, я изменил ваш ответ для моих нужд:

theme_new <- theme_set(theme_bw())
theme_new <- theme_update(axis.title.x = theme_text(family = base_family, size = base_size, vjust = 0.5))

Однако я получаю следующую ошибку:

ggplot(mtcars, aes(factor(cyl))) + geom_bar()

Ошибка в совпадении (gparname, names (gpars)): объект 'base_size' не найден


Редактировать: 31/10/2017, ответ, предоставленный @Andrie, работает отлично. R версия 3.4.1, ggplot2_2.2.1

Ответы [ 4 ]

25 голосов
/ 18 сентября 2011

Для работы вашего кода требуется всего несколько небольших изменений (в основном это удаление скобок и добавление скобок в нужных местах)

theme_new <- theme_set(theme_bw())

theme_new <- theme_update(
    panel.background = element_rect(fill="lightblue"))

ggplot(mtcars, aes(factor(cyl))) + geom_bar()

enter image description here


Ссылка:

11 голосов
/ 18 сентября 2011

wiki предлагает один из способов сделать это, используя modifyList,

theme_new <- function (base_size = 12, base_family = "", ...){
 modifyList (theme_bw (base_size = base_size, base_family = base_family),
          list (axis.title.x = theme_text(family = base_family, 
                size = base_size, vjust = 0.5)))
}
6 голосов
/ 14 июля 2015

Для более новых версий, основанных на статье здесь

txt <- element_text(size = 14, colour = "black", face = "plain")
bold_txt <- element_text(size = 14, colour = "black", face = "bold")

theme_whatever <- function(base_size = 14, base_family = "Palatino")
{
  theme_bw(base_size = base_size, base_family = base_family) +
  theme(
    legend.key = element_blank(), 
    strip.background = element_blank(), 

    text = txt, 
    plot.title = txt, 

    axis.title = txt, 
    axis.text = txt, 

    legend.title = bold_txt, 
    legend.text = txt ) 
}

Обратите внимание, что я использую txt и txt_bold, чтобы не писать снова и снова одни и те же вещи.

5 голосов
/ 18 сентября 2011

Попробуйте вот так:

### Set up a blank theme
theme_none <- theme(
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank(),
  panel.background = element_blank(),
  axis.title.x = element_text(colour=NA),
  axis.title.y = element_blank(),
  axis.text.x = element_blank(),
  axis.text.y = element_blank(),
  axis.line = element_blank()
  #axis.ticks.length = element_blank()
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...