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

之前學習的繪圖方法是基于R的基礎(chǔ)繪圖系統(tǒng)。在R中一共有四種作圖系統(tǒng),分別為base(之前學的)、grid、lattice,以及ggplot2。其中g(shù)gplot2包的目標是提供一個全面的、基于語法的,連貫一致的圖形生成系統(tǒng),允許用戶創(chuàng)建新穎的、有創(chuàng)新性的數(shù)據(jù)可視化圖形。關(guān)于另外兩種的介紹,見p402。

一、預準備

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

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

2、加載實驗數(shù)據(jù)
(1)mtcars數(shù)據(jù)集包括32輛車的詳細信息。

data(mtcars)

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

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

(3)Salaries數(shù)據(jù)集來自carData包(教材說是來自car包,可能是最近移動了),其包含了大學教授的收入信息,以及其它相關(guān)因素(級別、性別)。

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

二、基礎(chǔ)用法

一個簡單例子

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

如上一個簡單的ggplot繪圖包括主要有以下三方面內(nèi)容,用加號(+)相連組成的:
1、ggplot()函數(shù):用于交代繪圖的數(shù)據(jù)來源,并指定要使用的變量信息。其中的aes()即用來指定繪圖涉及到的變量,及每個變量扮演的角色,有時也包括分組信息。
2、geom_ 幾何函數(shù):指明視覺呈現(xiàn)方式(在我理解就是繪圖類型);一張圖里可以有多個幾何函數(shù)呈現(xiàn),即使用多個geom類型函數(shù)。
3、lab()函數(shù):主要用于添加注釋信息(標題等)。部分常用參數(shù)如下

  • title = 添加主標題;subtitle = 添加副標題,位于主標題下面,字體更小。
  • caption = 在圖形右下角添加文本,常用于描述數(shù)據(jù)來源。
  • x =y =修改坐標軸標題,colour = 修改圖例標題

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

汽車重量與MPG的散點圖

補充:關(guān)于ggplot的繪圖變量交代也可放在每個具體的繪圖函數(shù)中,ggplot()僅交代下數(shù)據(jù)來源。比如

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

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

1、geom類型

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

  • geom_bar() 表示條形圖,涉及選項有color、fill、alpha;
  • geom_boxplot() 表示箱線圖,涉及選項有color、fill、alpha、notch、width;
  • geom_histogram() 表示直方圖,涉及選項有color、fill、alpha、linetype、binwidth;
  • geom_point() 表示散點圖,涉及選項有color、alpha、shape、size;
  • geom_rug() 表示地毯圖,涉及選項有color、size。

2、常見選項(詳見p408)

  • fill 用于設(shè)置填充區(qū)域顏色;
  • color 用于設(shè)置點、線,邊界的顏色;
  • alpha 設(shè)置顏色透明度,1不透明;0透明;
  • linetype 設(shè)置線條類型;
  • shape 設(shè)置點的形狀;
  • position 參數(shù)對于點圖來說 jitter 減少點重疊;對條形圖而言有 dodge、stacked、fill三種模式(具體在例子中說明)。

例圖:三圖綜合

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")

如圖為箱線圖、點圖,地毯圖的混合圖。
(1)對箱線圖設(shè)置了填充顏色、邊界和點的顏色,以及方塊缺口;
(2)對點圖設(shè)置了隨機抖動(否則點就排成一列,難以觀察)、點的顏色、點的透明度;
(3)對地毯圖設(shè)置了出現(xiàn)位置,以及線的顏色。


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

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

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

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

四、分組與刻面

繪圖時,若存在一個/多個分類變量可以就分組關(guān)系將圖分類,以研究分類變量對數(shù)據(jù)的分布影響。例如將全校的成績按各個班級角度來看。

1、分組

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

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

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


基于學術(shù)級別分類,繪制畢業(yè)年數(shù)與收入的散點圖

補充1:分組顏色方案是ggplot2默認的,也可以選擇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")
)

補充2:二分類顏色

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = displ < 5))
#依據(jù)displ變量是否大于5,分為兩類顏色
  • 接下來舉一例:用性別分組的柱狀圖研究不同學術(shù)級別的人數(shù),并以此來探究下之前提到的position的三種設(shè)置的區(qū)別。(繪圖中用到了繪制多重圖的方法--grid.arrange()的使用也是一個常用的技巧)
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" 繪制堆疊分組,高度相同,按比例解釋。

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

2、刻面圖

(1)特征:區(qū)別于上述分組圖,刻面圖是按分類因子分開繪制數(shù)張圖(幾個類別就畫幾張圖)
(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行排列
八個聲部歌手的身高分布直方圖

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

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

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

五、自定義ggplot2圖形的外觀

1、坐標軸(p419)

主要針對兩類坐標軸:類別型與連續(xù)型

  • 以x軸為例分別為scale_x_discrete()、scale_x_continuous();
  • 主要涉及兩個參數(shù)breaks=、labels=
  • scale_x_discrete()、scale_y_discrete() 可用于修改x軸或y軸的刻度單位值(break=);修改刻度標簽(labels=)
    關(guān)于后者labels= 比較好理解,就是我們看到坐標軸上的注釋性刻度標簽;
    關(guān)于前者breaks=,是實際繪圖的參照軸刻度值。對于連續(xù)型變量,一般是從小到大的數(shù)值型向量;對于類別型變量,一般對應(yīng)實際數(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默認情況下會數(shù)據(jù)添加標簽、圖例等。
默認參數(shù)

(2)自定義標簽

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="")
修改標簽

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


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

2、圖例

自動生成的圖例都可以滿足大多數(shù)情況的需求。一般修改的話,即修改圖例的標題與位置。
(1)圖例標題在labs()函數(shù)的fill選項修改。本例中把sex改為了Gender。
(2)圖例位置通過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))

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

修改圖例

3、主題

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


    ggplot2內(nèi)置的8種主題
  • 如下示例對比
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")

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容