R語(yǔ)言入門--第十六節(jié)(ggplot2繪圖)

之前學(xué)習(xí)的繪圖方法是基于R的基礎(chǔ)繪圖系統(tǒng)鲁沥。在R中一共有四種作圖系統(tǒng)堤魁,分別為base(之前學(xué)的)、grid铐姚、lattice策肝,以及ggplot2。其中g(shù)gplot2包的目標(biāo)是提供一個(gè)全面的隐绵、基于語(yǔ)法的之众,連貫一致的圖形生成系統(tǒng),允許用戶創(chuàng)建新穎的依许、有創(chuàng)新性的數(shù)據(jù)可視化圖形棺禾。關(guān)于另外兩種的介紹,見p402峭跳。

一膘婶、預(yù)準(zhǔn)備

1、安裝加載包
不像基礎(chǔ)繪圖方法可以直接使用蛀醉,ggplot2包第一次使用要安裝悬襟、加載。

install.packages("ggplot2")
library(ggplot2)

2滞欠、加載實(shí)驗(yàn)數(shù)據(jù)
(1)mtcars數(shù)據(jù)集包括32輛車的詳細(xì)信息古胆。

data(mtcars)

(2)singer數(shù)據(jù)集來(lái)自lattice包,包括某合唱團(tuán)的身高與聲音變量

data(singer, package="lattice")
#lattice包已在基礎(chǔ)安裝里

(3)Salaries數(shù)據(jù)集來(lái)自carData包(教材說(shuō)是來(lái)自car包筛璧,可能是最近移動(dòng)了)逸绎,其包含了大學(xué)教授的收入信息,以及其它相關(guān)因素(級(jí)別夭谤、性別)棺牧。

install.packages("carData")
data(Salaries, package="carData") 

二、基礎(chǔ)用法

一個(gè)簡(jiǎn)單例子

ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_point() +
  labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")

如上一個(gè)簡(jiǎn)單的ggplot繪圖包括主要有以下三方面內(nèi)容朗儒,用加號(hào)(+)相連組成的:
1颊乘、ggplot()函數(shù):用于交代繪圖的數(shù)據(jù)來(lái)源,并指定要使用的變量信息醉锄。其中的aes()即用來(lái)指定繪圖涉及到的變量乏悄,及每個(gè)變量扮演的角色,有時(shí)也包括分組信息恳不。
2檩小、geom_ 幾何函數(shù):指明視覺呈現(xiàn)方式(在我理解就是繪圖類型);一張圖里可以有多個(gè)幾何函數(shù)呈現(xiàn)烟勋,即使用多個(gè)geom類型函數(shù)规求。
3筐付、lab()函數(shù):主要用于添加注釋信息(標(biāo)題等)。部分常用參數(shù)如下

  • title = 添加主標(biāo)題阻肿;subtitle = 添加副標(biāo)題瓦戚,位于主標(biāo)題下面,字體更小丛塌。
  • caption = 在圖形右下角添加文本较解,常用于描述數(shù)據(jù)來(lái)源。
  • x =y =修改坐標(biāo)軸標(biāo)題姨伤,colour = 修改圖例標(biāo)題

ggplot()函數(shù)中的變量選擇要根據(jù)自己想要繪制什么樣的圖來(lái)研究什么樣的變量關(guān)系來(lái)決定哨坪。

汽車重量與MPG的散點(diǎn)圖

補(bǔ)充:關(guān)于ggplot的繪圖變量交代也可放在每個(gè)具體的繪圖函數(shù)中庸疾,ggplot()僅交代下數(shù)據(jù)來(lái)源乍楚。比如

ggplot(data = mpg) +
  geom_point(aes(x = displ, y = hwy))
# 如果只使用ggplot(data = mpg)只會(huì)得到灰色背景

三、關(guān)于geom函數(shù)

1届慈、geom類型

目前一共有37個(gè)幾何函數(shù)可供使用徒溪,教材中列了常見的13種以及所涉及到的參數(shù)選項(xiàng)(p407)。比如

  • geom_bar() 表示條形圖金顿,涉及選項(xiàng)有color臊泌、fill、alpha揍拆;
  • geom_boxplot() 表示箱線圖渠概,涉及選項(xiàng)有color、fill嫂拴、alpha播揪、notch、width筒狠;
  • geom_histogram() 表示直方圖猪狈,涉及選項(xiàng)有color、fill辩恼、alpha雇庙、linetype、binwidth灶伊;
  • geom_point() 表示散點(diǎn)圖疆前,涉及選項(xiàng)有color、alpha聘萨、shape竹椒、size;
  • geom_rug() 表示地毯圖匈挖,涉及選項(xiàng)有color碾牌、size康愤。

2、常見選項(xiàng)(詳見p408)

  • fill 用于設(shè)置填充區(qū)域顏色舶吗;
  • color 用于設(shè)置點(diǎn)征冷、線,邊界的顏色誓琼;
  • alpha 設(shè)置顏色透明度检激,1不透明;0透明腹侣;
  • linetype 設(shè)置線條類型叔收;
  • shape 設(shè)置點(diǎn)的形狀;
  • position 參數(shù)對(duì)于點(diǎn)圖來(lái)說(shuō) jitter 減少點(diǎn)重疊傲隶;對(duì)條形圖而言有 dodge饺律、stacked、fill三種模式(具體在例子中說(shuō)明)跺株。

例圖:三圖綜合

ggplot(Salaries, aes(x=rank, y=salary)) +
  geom_boxplot(fill="cornflowerblue",
               color="black", notch=TRUE)+
  geom_point(position="jitter", color="blue", alpha=.5)+
  geom_rug(sides="l", color="black")

如圖為箱線圖复濒、點(diǎn)圖,地毯圖的混合圖乒省。
(1)對(duì)箱線圖設(shè)置了填充顏色巧颈、邊界和點(diǎn)的顏色,以及方塊缺口袖扛;
(2)對(duì)點(diǎn)圖設(shè)置了隨機(jī)抖動(dòng)(否則點(diǎn)就排成一列砸泛,難以觀察)、點(diǎn)的顏色蛆封、點(diǎn)的透明度唇礁;
(3)對(duì)地毯圖設(shè)置了出現(xiàn)位置,以及線的顏色娶吞。


學(xué)術(shù)級(jí)別與收入的關(guān)系

舉例-1:geom_smooth添加光滑曲線

除了上述提到的幾何函數(shù)類型垒迂,還有一種比較常見的函數(shù):為散點(diǎn)圖添加平滑曲線geom_smooth。其涉及到的參數(shù)有--(詳見p416)一般直接選默認(rèn)參數(shù)妒蛇。

  • method= 設(shè)置使用的平滑函數(shù)机断,默認(rèn)為smooth的非參數(shù)光滑曲線;此外還可選lm(線性)绣夺、glm(廣義線性)吏奸、rlm(穩(wěn)健線性)、gam(廣義相加)陶耍。
  • formula= 設(shè)置光滑函數(shù)公式奋蔚,默認(rèn)為y~x;如果是n次多項(xiàng)式,y~poly(x,n)
  • se 設(shè)置置信區(qū)間泊碑,默認(rèn)TRUE坤按。
  • level 設(shè)置置信水平,默認(rèn)95%
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
  geom_smooth() + geom_point()
#直接使用默認(rèn)參數(shù)
畢業(yè)年數(shù)與收入的關(guān)系馒过,并添加95%置信區(qū)間的光滑曲線
  • 如上圖臭脓,散點(diǎn)的線性關(guān)系不是很明顯。因此可以擬合一個(gè)二次多項(xiàng)式的回歸的有參模型腹忽。
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
  geom_smooth(method=lm, formula=y~poly(x,2),
              se=FALSE, size=1) +  #設(shè)置多項(xiàng)式擬合来累,并取消了置信區(qū)間  
              geom_point(size=2)
多項(xiàng)式擬合

四、分組與刻面

繪圖時(shí)窘奏,若存在一個(gè)/多個(gè)分類變量可以就分組關(guān)系將圖分類嘹锁,以研究分類變量對(duì)數(shù)據(jù)的分布影響。例如將全校的成績(jī)按各個(gè)班級(jí)角度來(lái)看着裹。

1领猾、分組

(1)特征:不同組的分類變量繪制在一張圖里。
(2)書寫格式:在aes()函數(shù)中指明用來(lái)區(qū)分分類變量的方法即可(比如顏色求冷、符號(hào)形狀等)瘤运;比如下例中的color=rank窍霞,左邊為區(qū)分方式(顏色)匠题、右邊為分類變量(等級(jí))。其它的分組依據(jù)還有:size =但金、alpha =韭山、shape =

ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank))  +
  geom_point()

這里繪制畢業(yè)年數(shù)與收入的關(guān)系,并想研究學(xué)術(shù)級(jí)別對(duì)其分布的影響


基于學(xué)術(shù)級(jí)別分類冷溃,繪制畢業(yè)年數(shù)與收入的散點(diǎn)圖

補(bǔ)充1:分組顏色方案是ggplot2默認(rèn)的钱磅,也可以選擇ColorBrewer 提供的系列配色方案;或者直接自己自定義似枕。例如下代碼---

ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank))  +
  geom_point()  +
  scale_color_brewer(palette = "Set1")
  #scale_colour_manual(
  #values = c(AsstProf = "red", AssocProf = "blue", Prof = "black")
)

補(bǔ)充2:二分類顏色

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = displ < 5))
#依據(jù)displ變量是否大于5盖淡,分為兩類顏色
  • 接下來(lái)舉一例:用性別分組的柱狀圖研究不同學(xué)術(shù)級(jí)別的人數(shù),并以此來(lái)探究下之前提到的position的三種設(shè)置的區(qū)別凿歼。(繪圖中用到了繪制多重圖的方法--grid.arrange()的使用也是一個(gè)常用的技巧)
library(gridExtra)
p1 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="stack") + labs(title='position="stack"')
p2 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="dodge") + labs(title='position="dodge"')
p3 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="fill") + labs(title='position="fill"')

grid.arrange(p1, p2, p3, ncol=3)

如下圖褪迟,可看出:
(1)position="stack" 繪制堆疊分組條形圖;
(2)position="dodge" 繪制分組條形圖并排答憔;
(3)position="fill" 繪制堆疊分組味赃,高度相同,按比例解釋虐拓。

學(xué)術(shù)級(jí)別人數(shù)基于性別的人數(shù)分布

2心俗、刻面圖

(1)特征:區(qū)別于上述分組圖,刻面圖是按分類因子分開繪制數(shù)張圖(幾個(gè)類別就畫幾張圖)
(2)函數(shù):刻面圖有專門的函數(shù)繪制,有以下4種--

  • facet_wrap(~var,ncol=n) 設(shè)置多圖排成n列城榛;
  • facet_wrap(~var,nrow=n) 設(shè)置多圖排成n行揪利;
data(singer, package="lattice")
library(ggplot2)
ggplot(data=singer, aes(x=height)) +
  geom_histogram() +
  facet_wrap(~voice.part, nrow=4)
#分成4行排列
八個(gè)聲部歌手的身高分布直方圖

如果想把多圖排成一個(gè)單列/單行,以便于比較組間數(shù)據(jù)差異狠持。(當(dāng)然前面提到的連個(gè)函數(shù)也可以)

  • facet_grid(var~.) 設(shè)置排成單列
  • facet_grid(.~var) 設(shè)置排成單行
ggplot(data=singer, aes(x=height, fill=voice.part)) +
  geom_density() +
  facet_grid(voice.part~.)
#單列排布土童,利于比較觀察
八個(gè)聲部歌手的身高分布密度圖

如果有兩個(gè)分類變量var1、var2工坊,分別有m献汗、n類,可以用facet_grid(var1~var2)函數(shù)繪制m*n個(gè)刻面圖王污。

五罢吃、自定義ggplot2圖形的外觀

1、坐標(biāo)軸(p419)

主要針對(duì)兩類坐標(biāo)軸:類別型與連續(xù)型

  • 以x軸為例分別為scale_x_discrete()昭齐、scale_x_continuous();
  • 主要涉及兩個(gè)參數(shù)breaks=尿招、labels=
  • scale_x_discrete()scale_y_discrete() 可用于修改x軸或y軸的刻度單位值(break=)阱驾;修改刻度標(biāo)簽(labels=)
    關(guān)于后者labels= 比較好理解就谜,就是我們看到坐標(biāo)軸上的注釋性刻度標(biāo)簽;
    關(guān)于前者breaks=里覆,是實(shí)際繪圖的參照軸刻度值丧荐。對(duì)于連續(xù)型變量,一般是從小到大的數(shù)值型向量喧枷;對(duì)于類別型變量虹统,一般對(duì)應(yīng)實(shí)際數(shù)據(jù)分類因子字符向量。具體見下例

(1)原圖

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  labs(title="Faculty Salary by Rank and Sex", x="", y="")
#ggplot2默認(rèn)情況下會(huì)數(shù)據(jù)添加標(biāo)簽隧甚、圖例等车荔。
默認(rèn)參數(shù)

(2)自定義標(biāo)簽

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
                   labels=c("Assistant\na",
                            "Associate\nb",
                            "Full\nc")) +
  scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
                     labels=c("$50K", "$100K", "$150K", "$200K")) +
  labs(title="Faculty Salary by Rank and Sex", x="", y="")
修改標(biāo)簽

注意如果想改變類別型變量在x軸上的分布次序,那么需要修改原數(shù)據(jù)該列的因子順序戚扳,對(duì)應(yīng)上例忧便,即Salaries$rank=factor(Salaries$rank,levels = c("Prof","AsstProf", "AssocProf")),再執(zhí)行上述操作帽借,即可改變箱圖的順序珠增。


補(bǔ)充:交換x、y軸+ coord_flip()

2宜雀、圖例

自動(dòng)生成的圖例都可以滿足大多數(shù)情況的需求切平。一般修改的話,即修改圖例的標(biāo)題與位置辐董。
(1)圖例標(biāo)題在labs()函數(shù)的fill選項(xiàng)修改悴品。本例中把sex改為了Gender。
(2)圖例位置通過(guò)theme()函數(shù)修改。本例中圖例位于距y軸10%苔严,距x軸80%定枷。

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  labs(title="Faculty Salary by Rank and Gender",
       x="", y="", fill="Gender") +
  theme(legend.position=c(.1,.8))

通過(guò)指定比例坐標(biāo)信息,可以將圖例擺放在繪圖區(qū)域的特定位置届氢。而ggplot默認(rèn)將圖例放在圖的右側(cè)(四周外面)legend.position="left/top/bottom/right"
legend.positon = "none"則會(huì)取消圖例欠窒。

修改圖例

3、主題

  • theme_*()族函數(shù)退子,來(lái)定制圖形中的非數(shù)據(jù)元素


    ggplot2內(nèi)置的8種主題
  • 如下示例對(duì)比
g1 <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = class))
g2 <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = class)) +
  theme_classic()
library(gridExtra)
grid.arrange(g1, g2, ncol=2)
g1 & g2

4岖妄、保存圖形

ggsave()函數(shù)
(1)保存指定圖形(plot、width寂祥、height)

myplot1 <- ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  labs(title="Faculty Salary by Rank and Gender",x="", y="")
ggsave(file="my01.png", plot=myplot1, width=5, height=4)
#保存尺寸為5英寸×4英寸荐虐,即12.7cm×10.2cm

(2)保存剛剛得到的圖形

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  labs(title="Faculty Salary by Rank and Gender",x="", y="")
ggsave(file="my02.png")

此外教材中還有三維氣泡圖,如何給分組觀測(cè)自定義顏色丸凭,以及主題的設(shè)置福扬,詳見p422。以上是關(guān)于ggplot2函數(shù)基礎(chǔ)知識(shí)的學(xué)習(xí)惜犀。ggplot2的功能是很強(qiáng)大的铛碑,后續(xù)有機(jī)會(huì)再進(jìn)行深入的探索與學(xué)習(xí)。
寒假關(guān)于R語(yǔ)言的學(xué)習(xí)可能就暫時(shí)到這一章節(jié)了虽界,之后要刷學(xué)校的網(wǎng)課了汽烦,盼望能夠早日開學(xué)吧。
參考教材《R語(yǔ)言實(shí)戰(zhàn)(第2版)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浓恳,一起剝皮案震驚了整個(gè)濱河市刹缝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颈将,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件言疗,死亡現(xiàn)場(chǎng)離奇詭異晴圾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)噪奄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門死姚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人勤篮,你說(shuō)我怎么就攤上這事都毒。” “怎么了碰缔?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵账劲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瀑焦,這世上最難降的妖魔是什么腌且? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮榛瓮,結(jié)果婚禮上铺董,老公的妹妹穿的比我還像新娘。我一直安慰自己禀晓,他們只是感情好精续,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粹懒,像睡著了一般驻右。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崎淳,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天堪夭,我揣著相機(jī)與錄音,去河邊找鬼拣凹。 笑死森爽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嚣镜。 我是一名探鬼主播爬迟,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菊匿!你這毒婦竟也來(lái)了付呕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跌捆,失蹤者是張志新(化名)和其女友劉穎徽职,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佩厚,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姆钉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抄瓦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潮瓶。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钙姊,靈堂內(nèi)的尸體忽然破棺而出毯辅,到底是詐尸還是另有隱情,我是刑警寧澤煞额,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布思恐,位于F島的核電站沾谜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏壁袄。R本人自食惡果不足惜类早,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗜逻。 院中可真熱鬧涩僻,春花似錦、人聲如沸栈顷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)萄凤。三九已至室抽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間靡努,已是汗流浹背坪圾。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惑朦,地道東北人兽泄。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像漾月,于是被迫代替她去往敵國(guó)和親病梢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355