将一个ggplot默认主题元素替换为另一个默认主题中的元素

时间:2017-05-19 15:05:30

标签: r ggplot2

我非常喜欢ggplot2的{​​{1}} ggtheme的所有内容,除非它隐藏所有轴标题。

我如何使用theme_fivethirtyeight()但是告诉它从另一个主题继承轴标题规范?

3 个答案:

答案 0 :(得分:3)

这可以通过很多方式解决。最短的可能是覆盖@ {eipi10建议的element_text参数。这需要针对每个单独的情节重复进行。

另一种方法是根据现有主题创建自己的自定义主题。 这种方法的好处是,您可以按照自己喜欢的方式重复使用主题。以下是使用theme_fivethiryeight()的示例。

关键部分是:

   mytheme <- theme_fivethirtyeight() +
  theme(axis.title = element_text(colour = "black" ))

创建一些虚拟数据以使用:

library("ggplot2")
library("ggthemes")
# make the results reproducible
set.seed(5117)  

start_date <- as.Date("2015-01-01") 
end_date <- as.Date("2017-06-10")

# the by=7 makes it one observation per week (adjust as needed)
dates <- seq(from = start_date, to = end_date, by = 7)
val1 <- rnorm(length(dates), mean = 12.5, sd = 3)

qnt <- quantile(val1, c(.05, .25, .75, .95))

mock <- data.frame(myDate = dates, val1)

p <- ggplot(data = mock, mapping = aes(x = myDate, y = val1)) +
  geom_line() +
  geom_point() +
  geom_hline(yintercept = qnt[1], colour = "red") +
  geom_hline(yintercept = qnt[4], colour = "red") +
  geom_hline(yintercept = qnt[2], colour = "lightgreen") +
  geom_hline(yintercept = qnt[3], colour = "lightgreen") +
  scale_x_date(date_breaks = "6 month", date_labels = "%b-%y") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) 

以下是添加原始theme_fivethirtyeight()以供参考:

p + theme_fivethirtyeight()

original theme plot

创建自定义主题:

mytheme <- theme_fivethirtyeight() +
  theme(axis.title = element_text(colour = "black" ))

将自定义主题应用于原始图:

p + mytheme

custom theme plot

您可以在命令提示符下键入主题名称(不带“()”),以了解可用于自定义的其他选项。在这里,我突出显示了被替换的axis.title = element_blank()

theme_code

答案 1 :(得分:1)

您可以使用%+replace%替换所需的特定主题元素。对于任何主题,您都可以使用[[检索主题元素。因此,如果您希望来自axis.title theme_gdocs的主题,您可以执行:theme_gdocs()[["axis.title"]]。这应该适合你:

ggplot(mtcars) + geom_point(aes(hp, cyl)) + 
                 theme_fivethirtyeight() %+replace% theme(axis.title = theme_gdocs()[["axis.title"]],
                                                         axis.title.x = theme_gdocs()[["axis.title.x"]],
                                                         axis.title.y = theme_gdocs()[["axis.title.y"]])

enter image description here

我使用theme_gdocs作为示例,但您可以将其替换为您想要的任何主题。

答案 2 :(得分:1)

ggplot_merge_styles <- function(theme, ...) {
  elements <- lapply(as.list(match.call())[-1], function(x) eval(parse(text=deparse(x))))
  for (element in names(elements)) {
    if (element != 'theme') {
      theme[[element]] <- elements[[element]]
    }
  }
  
  return(theme)
}

然后您可以指定某些设计属性并将它们与其他样式合并在一起。

例如,我喜欢 theme_minimal()plot.title 的设计,只是我希望它是灰色而不是普通的黑色。然后通过运行以下代码,所有 plot.title 属性都被保留,除了被替换的颜色:

plot <- 
  ... +
  theme(plot.title = ggplot_merge_styles(theme_minimal()[['plot.title']], colour = "#6f7170"))