有小伙伴在說可以用par(mar)來設(shè)置畫圖的margin焦匈,但不能應(yīng)用于ggplot2血公,這個(gè)可能很多新手都會(huì)很困擾,可能需要一段時(shí)間的探索之后缓熟,才能發(fā)現(xiàn)原來是用theme來設(shè)定累魔。
這當(dāng)然你可以歸結(jié)于說ggplot2和base plot是不同的東西,但從實(shí)質(zhì)畫圖參數(shù)這一點(diǎn)而言够滑,并沒有什么同與不同垦写,無非是設(shè)置的方式不同而已,而這種方式都是人定義的彰触,我們完全可以人為定義它們兼容梯投。
這里我用了一個(gè)ggpar
的函數(shù),我們傳入mar=rep(6,4)
况毅,就像我們用par
一樣分蓖,而這個(gè)ggpar
它事實(shí)上就設(shè)置了par
,所以我畫第一張圖尔许,用base plot么鹤,我們發(fā)現(xiàn)margin已經(jīng)按照我們的設(shè)定分配了。
然后我打開另一個(gè)畫圖窗口母债,再用ggplot2
畫午磁,我們發(fā)現(xiàn)咦ggplot2
也認(rèn)這個(gè)參數(shù),margin也設(shè)置好了毡们。當(dāng)然細(xì)心的你可能發(fā)現(xiàn)ggplot2
的畫圖區(qū)域更小迅皇,這是base plot和ggplot2
對(duì)margin的定義不同的緣故,base plot的margin是畫圖框外面的區(qū)域衙熔,而ggplot2
的margin是畫圖內(nèi)容之外的區(qū)域登颓,像axis text和label都在畫圖區(qū)域之內(nèi),這樣你再對(duì)比右邊的兩張圖,你就會(huì)發(fā)現(xiàn)margin果然是一致的红氯,ggpar
果然同時(shí)改變了base plot和ggplot2
的默認(rèn)設(shè)置框咙。
然后我再改變ggplot2
的主題,再打開一個(gè)畫圖窗口痢甘,然后再設(shè)置ggpar
喇嘱,證明ggpar
可以應(yīng)用于ggplot2
當(dāng)前的任何主題。畫出了圖中代碼下面的圖塞栅。
就是這么神奇者铜!你只要能夠深入了解,很多東西就不是不可以放椰,而是可能作烟,以及該如何實(shí)現(xiàn)。
產(chǎn)生上面圖的代碼如下:
library(yyplot2)
ggpar(mar=rep(6,4))
d=data.frame(x=rnorm(10), y=rnorm(10))
plot(d$x, d$y)
X11()
ggplot(d, aes(x,y)) + geom_point()
theme_set(theme_minimal())
X11()
ggpar(mar=rep(1,4))
ggplot(d, aes(x,y)) + geom_point()
到上面為止砾医,已經(jīng)讓人掉下巴了拿撩,但不夠完美,因?yàn)樗肓艘粋€(gè)新函數(shù)如蚜!這簡(jiǎn)直是廢話压恒,因?yàn)闆]有新函數(shù)的引入就沒有這個(gè)可以兼容彼此的功能。能不能不要搞多個(gè)函數(shù)错邦?我早上醒來的時(shí)候這樣問自己涎显,并且跟自己說做為男人不能說不行!(這可咋整兴猩?請(qǐng)思考3分鐘再往下看)
ggpar
必須要有期吓,不然沒這功能,你需要用ggpar
來設(shè)置倾芝,或者你不帶參數(shù)單獨(dú)跑ggpar()
讨勤,它會(huì)去獲取你已經(jīng)設(shè)置或者沒有設(shè)置(默認(rèn)值)的par參數(shù)。再者你用theme_set
換默認(rèn)主題時(shí)晨另,你需要再跑ggpar()
去追加par
的設(shè)置到默認(rèn)主題中潭千,這合情合理,也就每次多跑一下ggpar()
借尿,讓彼此兼容刨晴!
但能不能讓它存在于無形之中屉来?也就是說我還像往常一樣,用了par()
來設(shè)置狈癞,然后ggplot2
也認(rèn)茄靠,而我用theme_set
設(shè)置主題的時(shí)候,也不需要跑ggpar
去追加par
設(shè)置蝶桶。這聽起來特別美好慨绳!
要實(shí)現(xiàn)其實(shí)也不難,就是重置函數(shù)真竖,我們把R的par
函數(shù)給換掉脐雪,你par
還是你par
,該干的話照干恢共,你par
已經(jīng)不是你par
战秋,它還跑了ggpar
.
par = function(...) { graphics:::par(...); ggpar()}
一句話的事情,然后你用par
讨韭,ggplot2
就認(rèn)了获询。
theme_set = function(...) {ggplot2::theme_set(...); yyplot::ggpar()}
theme_set
也是一樣,當(dāng)你換主題的時(shí)候拐袜,自動(dòng)追加par
的設(shè)置吉嚣。
什么叫存在于無形之中?你不是也得重定義par
和theme_set
函數(shù)嘛蹬铺,如果你能這樣問我尝哆?我給你點(diǎn)個(gè)贊,我們?cè)侔堰@兩個(gè)簡(jiǎn)單的函數(shù)放在.Rprofile中甜攀,這樣你每次打開R秋泄,這兩個(gè)函數(shù)就被定義了,而你啥都沒有干规阀!然后你用的par
恒序,該怎么用還怎么用,但是ggplot2
認(rèn)你的設(shè)置谁撼,你用theme_set
換主題歧胁,會(huì)自己追加par
設(shè)置,你啥額外的事情都不用干@鞯:拔 !這就叫存在于無形中箍鼓,這就叫完全兼容崭参。
這個(gè)ggpar
函數(shù)我放在yyplot
包中,只是給大家開個(gè)眼界款咖,是知識(shí)限制了我們的想像力何暮。目前版本只適用于設(shè)置margin奄喂,其它一些參數(shù)也是可以的,大家有興趣可以去github上fork海洼,或者我以后在實(shí)踐中覺得有必要搞(因?yàn)榭梢宰屧O(shè)置ggplot2
默認(rèn)主題參數(shù)變得容易)跨新,再繼續(xù)搞吧。目前只是拋磚引玉贰军,放飛大家的想像力玻蝌。
這個(gè)需求可能還是比較大的蟹肘,畢竟ggplot2
的設(shè)置還是比較困難的词疼,而且R新手多半是有學(xué)base plot的,會(huì)讓主題設(shè)置變得非常容易帘腹。