如何为R中的ggplot预设绘图选项的好方法

7

我需要翻译一些关于IT技术的内容。这段文字描述了一个问题:文件中存在许多冗长而重复的ggplot2命令。目前,我使用变量来控制预设值,以保持图形的统一性,并在一个位置上配置(例如,更改所有图形的颜色)。

我真正想要的是一个好的方法来预置这些指令,这样我就不必到处写语句。例如,在文件的顶部定义:

OPTAX=theme_text(angle=30, hjust=1, vjust=1, size=8)

当涉及到情节陈述时,我使用

P<-ggplot(
       data=MYDATA,
       aes(x=Topics, y=value, fill=variable)) +
       ....
       opts(axis.text.x=OPTAX)
)

我希望避免写axis.text.x=MYVAR这部分内容,而是写类似于下面的语句:

... + opts(MYOPTS) + ...

或者完全避免使用opts语句,直接编写
... + ALLMYOPTS + ...

所有选项都在一个语句中预定义。

其次,最好能够覆盖该语句。类似于:

opts(MYOPTS, axis.text.x=theme_text(angle=60)

为了保留预设但仍可以使用自定义选项,这将是非常好的。
4个回答

11

你可以将各种ggplot的设置(不仅限于opts)组合在一起并应用于多个图形,使用列表:

myPrettyOptions = list(
   opts(axis.text.x=OPTAX),
   facet_wrap(~Topic),
   limits(x=c(1,2)),
   scale_x_discrete(expand=c(0,0,5))
)

然后在多个位置使用此代码:(想想你将节省的空间!):

ggplot(blah) + myPrettyOptions
# in the second plot we can override the options:
ggplot(foo) + myPrettyOptions + opts(axis.text.x=theme_text(angle=60)
你可以进一步扩展这个想法,准备除了数据以外的所有内容:
graphtemplate = ggplot(blah) + myPrettyOptions
graphtemplate %+% data1
graphtemplate %+% data2

注意使用 %+% 操作符。


%+% 运算符是做什么用的?(这些 %...% 的东西无法在谷歌上搜索,我在 R 手册中也找不到 %+% - DunderChief
1
没事了,我已经解决了。顺便说一下,你可以通过 ?\%+%`` 获取这些运算符的帮助,并使用 http://www.symbolhound.com/ 搜索奇怪字符。 - DunderChief
optsggplot2中已被弃用:请改用“theme”。 - Spacedman

4
一个更加简洁的方法是使用theme_update、theme_get和theme_set方法。这些方法与主题相关。
old.theme <- theme_update(axis.text.x = theme_text(angle=30, hjust=1, vjust=1, size=8))
qplot(1,1)

如果你想回到旧主题,请简单地执行以下操作:
theme_set(old.theme)
qplot(1,1)

1
使用最新的 ggplot2,上述解决方案可以用 element_text() 替代 theme_text() 很好地实现。 - Mark Nielsen

1

这将起作用:

ALLMYOPTS <- opts(axis.text.x = theme_text(angle=30, hjust=1, vjust=1, size=8))
P + ALLMYOPTS

谢谢。这很有效,ggplot接受最后一个选项作为有效选项,因此很容易覆盖它们。 - count0

0

首先将每个参数放入一个对象中,例如:

 a<- theme(axis.title.y = element_text(angle = 0))
    b<- theme(panel.background = element_rect(fill = "#e4e4e4")) + theme(axis.title.y = element_text(angle = 0, size=rel(1.5)))+ theme(axis.title.x=element_text(size=rel(1.5))) + theme(legend.text=element_text(size=rel(1.5)))+ theme(legend.title=element_text(size=rel(1.5), face = "italic")) + theme(plot.title = element_text(size = rel(1.5))) + theme(axis.text = element_text(size=rel(1.0)))
    c<- theme(axis.line.x=element_line(size=0.5, colour="black"))
    d<- theme(axis.line.y=element_line(size=0.5, colour="black"))
    e<- theme(legend.box.just = c("top"), legend.position="bottom",legend.justification=c(1,1), legend.direction="vertical", legend.box="horizontal") + theme(panel.grid.minor.y = element_blank())
    f<- ggplot(blah) + a +b +c +d +e
    f

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接