簡(jiǎn)介
文章較長(zhǎng)笼踩,點(diǎn)擊直達(dá)我的博客,瀏覽效果更好谷市。
本文內(nèi)容基本是來(lái)源于STHDA蛔垢,這是一份十分詳細(xì)的ggplot2使用指南,因此我將其翻譯成中文迫悠,一是有助于我自己學(xué)習(xí)理解鹏漆,另外其他R語(yǔ)言愛(ài)好者或者可視化愛(ài)好者可以用來(lái)學(xué)習(xí)。翻譯過(guò)程肯定不能十全十美,各位讀者有建議或改進(jìn)的話艺玲,十分歡迎發(fā)Email(tyan@zju.edu.cn)給我括蝠。
ggplot2是由Hadley Wickham創(chuàng)建的一個(gè)十分強(qiáng)大的可視化R包。按照ggplot2的繪圖理念饭聚,Plot(圖)= data(數(shù)據(jù)集)+ Aesthetics(美學(xué)映射)+ Geometry(幾何對(duì)象):
- data: 數(shù)據(jù)集忌警,主要是data frame;
- Aesthetics: 美學(xué)映射若治,比如將變量映射給x,y坐標(biāo)軸慨蓝,或者映射給顏色、大小端幼、形狀等圖形屬性礼烈;
- Geometry: 幾何對(duì)象,比如柱形圖婆跑、直方圖此熬、散點(diǎn)圖、線圖滑进、密度圖等犀忱。
在ggplot2中有兩個(gè)主要繪圖函數(shù):qplot()以及ggplot()。
- qplot(): 顧名思義扶关,快速繪圖阴汇;
- ggplot():此函數(shù)才是ggplot2的精髓,遠(yuǎn)比qplot()強(qiáng)大节槐,可以一步步繪制十分復(fù)雜的圖形搀庶。
由ggplot2繪制出來(lái)的ggplot圖可以作為一個(gè)變量铜异,然后由print()顯示出來(lái)哥倔。
圖形類(lèi)型
根據(jù)數(shù)據(jù)集,ggplot2提供不同的方法繪制圖形揍庄,主要是為下面幾類(lèi)數(shù)據(jù)類(lèi)型提供繪圖方法:
- 一個(gè)變量x: 連續(xù)或離散
- 兩個(gè)變量x&y:連續(xù)和(或)離散
- 連續(xù)雙變量分布x&y: 都是連續(xù)
- 誤差棒
- 地圖
- 三變量
安裝及加載
安裝ggplot2提供三種方式:
#直接安裝tidyverse咆蒿,一勞永逸(推薦,數(shù)據(jù)分析大禮包)
install.packages("tidyverse")
#直接安裝ggplot2
install.packages("ggplot2")
#從Github上安裝最新的版本,先安裝devtools(如果沒(méi)安裝的話)
devtools::install_github("tidyverse/ggplot2")
加載
library(ggplot2)
數(shù)據(jù)準(zhǔn)備
數(shù)據(jù)集應(yīng)該數(shù)據(jù)框data.frame
本文將使用數(shù)據(jù)集mtcars蚂子。
#load the data set
data(mtcars)
df <- mtcars[, c("mpg","cyl","wt")]
#將cyl轉(zhuǎn)為因子型factor
df$cyl <- as.factor(df$cyl)
head(df)
## mpg cyl wt
## Mazda RX4 21.0 6 2.620
## Mazda RX4 Wag 21.0 6 2.875
## Datsun 710 22.8 4 2.320
## Hornet 4 Drive 21.4 6 3.215
## Hornet Sportabout 18.7 8 3.440
## Valiant 18.1 6 3.460
qplot()
qplot()類(lèi)似于R基本繪圖函數(shù)plot(),可以快速繪制常見(jiàn)的幾種圖形:散點(diǎn)圖形帮、箱線圖刃麸、小提琴圖书蚪、直方圖以及密度曲線圖竹海。其繪圖格式為:
qplot(x, y=NULL, data, geom="auto")
其中:
- x,y: 根據(jù)需要繪制的圖形使用;
- data:數(shù)據(jù)集;
- geom:幾何圖形度苔,變量x,y同時(shí)指定的話默認(rèn)為散點(diǎn)圖族吻,只指定x的話默認(rèn)為直方圖捏境。
散點(diǎn)圖
qplot(x=mpg, y=wt, data=df, geom = "point")
也可以添加平滑曲線
qplot(x=mpg, y=wt, data = df, geom = c("point", "smooth"))
還有其他參數(shù)可以修改峻村,比如點(diǎn)的形狀、大小钠糊、顏色等
#將變量cyl映射給顏色和形狀
qplot(x=mpg, y=wt, data = df, colour=cyl, shape=cyl)
箱線圖挟秤、小提琴圖、點(diǎn)圖
#構(gòu)造數(shù)據(jù)集
set.seed(1234)
wdata <- data.frame(
sex=factor(rep(c("F", "M"), each=200)),
weight=c(rnorm(200, 55), rnorm(200, 58))
)
head(wdata)
## sex weight
## 1 F 53.79293
## 2 F 55.27743
## 3 F 56.08444
## 4 F 52.65430
## 5 F 55.42912
## 6 F 55.50606
箱線圖
qplot(sex, weight, data = wdata, geom = "boxplot", fill=sex)
小提琴圖
qplot(sex, weight, data = wdata, geom = "violin")
點(diǎn)圖
qplot(sex, weight, data = wdata, geom = "dotplot", stackdir="center", binaxis="y", dotsize=0.5, color=sex)
直方圖抄伍、密度圖
直方圖
qplot(weight, data = wdata, geom = "histogram", fill=sex)
密度圖
qplot(weight, data = wdata, geom = "density", color=sex, linetype=sex)
ggplot()
上文中的qplot()繪制散點(diǎn)圖:
qplot(x=mpg, y=wt, data=df, geom = "point")
在ggplot()中完全可以如下實(shí)現(xiàn):
ggplot(data=df, aes(x=mpg, y=wt))+
geom_point()
改變點(diǎn)形狀艘刚、大小、顏色等屬性
ggplot(data=df, aes(x=mpg, y=wt))+geom_point(color="blue", size=2, shape=23)
繪圖過(guò)程中常常要用到轉(zhuǎn)換(transformation),這時(shí)添加圖層的另一個(gè)方法是用stat_*()函數(shù)截珍。
下例中的geom_density()與stat_density()是等價(jià)的
ggplot(wdata, aes(x=weight))+geom_density()
等價(jià)于
ggplot(wdata, aes(x=weight))+stat_density()
對(duì)于每一種幾何圖形攀甚。ggplot2 基本都提供了 geom_()和 stat_()
一個(gè)變量:連續(xù)型
使用數(shù)據(jù)集wdata,先計(jì)算出不同性別的體重平均值
library(plyr)
mu <- ddply(wdata, "sex", summarise, grp.mean=mean(weight))
先繪制一個(gè)圖層a,后面逐步添加圖層
a <- ggplot(wdata, aes(x=weight))
可能添加的圖層有:
- 對(duì)于一個(gè)連續(xù)變量:
- 面積圖geom_area()
- 密度圖geom_density()
- 點(diǎn)圖geom_dotplot()
- 頻率多邊圖geom_freqpoly()
- 直方圖geom_histogram()
- 經(jīng)驗(yàn)累積密度圖stat_ecdf()
- QQ圖stat_qq()
- 對(duì)于一個(gè)離散變量:
- 條形圖geom_bar()
面積圖
a+geom_area(stat = "bin")
改變顏色
a+geom_area(aes(fill=sex), stat = "bin", alpha=0.6)+
theme_classic()
注意:y軸默認(rèn)為變量weight的數(shù)量即count岗喉,如果y軸要顯示密度秋度,可用以下代碼:
a+geom_area(aes(y=..density..), stat = "bin")
可以通過(guò)修改不同屬性如透明度、填充顏色钱床、大小荚斯、線型等自定義圖形:
密度圖
使用以下函數(shù):
- geom_density():繪制密度圖
- geom_vline():添加豎直線
- scale_color_manual():手動(dòng)修改顏色
a+geom_density()
根據(jù)sex修改顏色,將sex映射給line顏色
a+geom_density(aes(color=sex))
修改填充顏色以及透明度
a+geom_density(aes(fill=sex), alpha=0.4)
添加均值線以及手動(dòng)修改顏色
a+geom_density(aes(color=sex))+
geom_vline(data=mu, aes(xintercept=grp.mean, color=sex), linetype="dashed")+
scale_color_manual(values = c("red", "blue"))
點(diǎn)圖
a+geom_dotplot()
將sex映射給顏色
a+geom_dotplot(aes(fill=sex))
手動(dòng)修改顏色
a+geom_dotplot(aes(fill=sex))+
scale_fill_manual(values=c("#999999", "#E69F00"))
頻率多邊圖
a+geom_freqpoly()
y軸顯示為密度
a+geom_freqpoly(aes(y=..density..))+
theme_minimal()
修改顏色以及線型
a+geom_freqpoly(aes(color=sex, linetype=sex))+
theme_minimal()
直方圖
a+geom_histogram()
將sex映射給線顏色
a+geom_histogram(aes(color=sex), fill="white", position = "dodge")+theme_classic()
經(jīng)驗(yàn)累積密度圖
a+stat_ecdf()
QQ圖
ggplot(data = mtcars, aes(sample=mpg))+stat_qq()
一個(gè)離散變量
#加載數(shù)據(jù)集
data(mpg)
b <- ggplot(mpg, aes(x=fl))
b+geom_bar()
修改填充顏色
b+geom_bar(fill="steelblue", color="black")+theme_classic()
兩個(gè)變量:x,y皆連續(xù)
使用數(shù)據(jù)集mtcars查牌, 先創(chuàng)建一個(gè)ggplot圖層
b <- ggplot(data = mtcars, aes(x=wt, y=mpg))
可能添加的圖層有:
- geom_point():散點(diǎn)圖
- geom_smooth():平滑線
- geom_quantile():分位線
- geom_rug():邊際地毯線
- geom_jitter():避免重疊
- geom_text():添加文本注釋
散點(diǎn)圖
b+geom_point()
將變量cyl映射給點(diǎn)的顏色和形狀
b + geom_point(aes(color = factor(cyl), shape = factor(cyl)))
自定義顏色
b+geom_point(aes(color=factor(cyl), shape=factor(cyl)))+
scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))+theme_classic()
平滑線
可以添加回歸曲線
b+geom_smooth()
散點(diǎn)圖+回歸線
b+geom_point()+
geom_smooth(method = "lm", se=FALSE)#去掉置信區(qū)間
使用loess方法
b+geom_point()+
geom_smooth(method = "loess")
將變量映射給顏色和形狀
b+geom_point(aes(color=factor(cyl), shape=factor(cyl)))+
geom_smooth(aes(color=factor(cyl), shape=factor(cyl)), method = "lm", se=FALSE, fullrange=TRUE)
分位線
ggplot(data = mpg, aes(cty, hwy))+
geom_point()+geom_quantile()+
theme_minimal()
邊際地毯線
使用數(shù)據(jù)集faithful
ggplot(data = faithful, aes(x=eruptions, y=waiting))+
geom_point()+geom_rug()
避免重疊
實(shí)際上geom_jitter()
是geom_point(position="jitter")
的簡(jiǎn)稱,下面使用數(shù)據(jù)集mpg
p <- ggplot(data = mpg, aes(displ, hwy))
p+geom_point()
增加抖動(dòng)防止重疊
p+geom_jitter(width = 0.5, height = 0.5)
其中兩個(gè)參數(shù):
- width:x軸方向的抖動(dòng)幅度
- height:y軸方向的抖動(dòng)幅度
文本注釋
參數(shù)label用來(lái)指定注釋標(biāo)簽
b+geom_text(aes(label=rownames(mtcars)))
兩個(gè)變量:連續(xù)二元分布
使用數(shù)據(jù)集diamonds
head(diamonds[, c("carat", "price")])
## # A tibble: 6 x 2
## carat price
## <dbl> <int>
## 1 0.23 326
## 2 0.21 326
## 3 0.23 327
## 4 0.29 334
## 5 0.31 335
## 6 0.24 336
創(chuàng)建ggplot圖層,后面再逐步添加圖層
c <- ggplot(data=diamonds, aes(carat, price))
可添加的圖層有:
- geom_bin2d(): 二維封箱熱圖
- geom_hex(): 六邊形封箱圖
- geom_density_2d(): 二維等高線密度圖
二維封箱熱圖
geom_bin2d()
將點(diǎn)的數(shù)量用矩形封裝起來(lái)事期,通過(guò)顏色深淺來(lái)反映點(diǎn)密度
c+geom_bin2d()
設(shè)置bin的數(shù)量
c+geom_bin2d(bins=150)
六邊形封箱圖
geom_hex()依賴于另一個(gè)R包hexbin,所以沒(méi)安裝的先安裝:
install.packages("hexbin")
library(hexbin)
c+geom_hex()
修改bin的數(shù)目
c+geom_hex(bins=10)
二維等高線密度圖
sp <- ggplot(faithful, aes(x=eruptions, y=waiting))
sp+geom_point()+ geom_density_2d()
兩個(gè)變量:連續(xù)函數(shù)
主要是如何通過(guò)線來(lái)連接兩個(gè)變量纸颜,使用數(shù)據(jù)集economics兽泣。
head(economics)
## # A tibble: 6 x 6
## date pce pop psavert uempmed unemploy
## <date> <dbl> <int> <dbl> <dbl> <int>
## 1 1967-07-01 507.4 198712 12.5 4.5 2944
## 2 1967-08-01 510.5 198911 12.5 4.7 2945
## 3 1967-09-01 516.3 199113 11.7 4.6 2958
## 4 1967-10-01 512.9 199311 12.5 4.9 3143
## 5 1967-11-01 518.1 199498 12.5 4.7 3066
## 6 1967-12-01 525.8 199657 12.1 4.8 3018
先創(chuàng)建一個(gè)ggplot圖層,后面逐步添加圖層
d <- ggplot(data = economics, aes(x=date, y=unemploy))
可添加的圖層有:
- geom_area():面積圖
- geom_line():折線圖
- geom_step(): 階梯圖
面積圖
d+geom_area()
線圖
d+geom_line()
階梯圖
set.seed(1111)
ss <- economics[sample(1:nrow(economics), 20),]
ggplot(ss, aes(x=date, y=unemploy))+
geom_step()
兩個(gè)變量:x離散胁孙,y連續(xù)
使用數(shù)據(jù)集ToothGrowth,其中的變量len(Tooth length)是連續(xù)變量唠倦,dose是離散變量。
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
head(ToothGrowth)
## len supp dose
## 1 4.2 VC 0.5
## 2 11.5 VC 0.5
## 3 7.3 VC 0.5
## 4 5.8 VC 0.5
## 5 6.4 VC 0.5
## 6 10.0 VC 0.5
創(chuàng)建圖層
e <- ggplot(data = ToothGrowth, aes(x=dose, y=len))
可添加的圖層有:
- geom_boxplot(): 箱線圖
- geom_violin():小提琴圖
- geom_dotplot():點(diǎn)圖
- geom_jitter(): 帶狀圖
- geom_line(): 線圖
- geom_bar(): 條形圖
箱線圖
e+geom_boxplot()
添加有缺口的箱線圖
e+geom_boxplot(notch = TRUE)
按dose分組映射給顏色
e+geom_boxplot(aes(color=dose))
將dose映射給填充顏色
e+geom_boxplot(aes(fill=dose))
按supp進(jìn)行分類(lèi)并映射給填充顏色
ggplot(ToothGrowth, aes(x=dose, y=len))+ geom_boxplot(aes(fill=supp))
小提琴圖
e+geom_violin(trim = FALSE)
添加中值點(diǎn)
e+geom_violin(trim = FALSE)+
stat_summary(fun.data = mean_sdl, fun.args = list(mult=1),
geom="pointrange", color="red")
與箱線圖結(jié)合
e+geom_violin(trim = FALSE)+
geom_boxplot(width=0.2)
將dose映射給顏色進(jìn)行分組
e+geom_violin(aes(color=dose), trim = FALSE)
點(diǎn)圖
e+geom_dotplot(binaxis = "y", stackdir = "center")
添加中值點(diǎn)
e + geom_dotplot(binaxis = "y", stackdir = "center") +
stat_summary(fun.data=mean_sdl, color = "red",geom = "pointrange",fun.args=list(mult=1))
與箱線圖結(jié)合
e + geom_boxplot() +
geom_dotplot(binaxis = "y", stackdir = "center")
添加小提琴圖
e + geom_violin(trim = FALSE) +
geom_dotplot(binaxis='y', stackdir='center')
將dose映射給顏色以及填充色
e + geom_dotplot(aes(color = dose, fill = dose),
binaxis = "y", stackdir = "center")
帶狀圖
帶狀圖是一種一維散點(diǎn)圖浊洞,當(dāng)樣本量很小時(shí)牵敷,與箱線圖相當(dāng)
e + geom_jitter(position=position_jitter(0.2))
添加中值點(diǎn)
e + geom_jitter(position=position_jitter(0.2)) +
stat_summary(fun.data="mean_sdl", fun.args = list(mult=1),
geom="pointrange", color = "red")
與點(diǎn)圖結(jié)合
e + geom_jitter(position=position_jitter(0.2)) +
geom_dotplot(binaxis = "y", stackdir = "center")
與小提琴圖結(jié)合
e + geom_violin(trim = FALSE) +
geom_jitter(position=position_jitter(0.2))
將dose映射給顏色和形狀
e + geom_jitter(aes(color = dose, shape = dose),
position=position_jitter(0.2))
線圖
#構(gòu)造數(shù)據(jù)集
df <- data.frame(supp=rep(c("VC", "OJ"), each=3),
dose=rep(c("D0.5", "D1", "D2"),2),
len=c(6.8, 15, 33, 4.2, 10, 29.5))
head(df)
## supp dose len
## 1 VC D0.5 6.8
## 2 VC D1 15.0
## 3 VC D2 33.0
## 4 OJ D0.5 4.2
## 5 OJ D1 10.0
## 6 OJ D2 29.5
將supp映射線型
ggplot(df, aes(x=dose, y=len, group=supp)) +
geom_line(aes(linetype=supp))+
geom_point()
修改線型、點(diǎn)的形狀以及顏色
ggplot(df, aes(x=dose, y=len, group=supp)) +
geom_line(aes(linetype=supp, color = supp))+
geom_point(aes(shape=supp, color = supp))
條形圖
#構(gòu)造數(shù)據(jù)集
df <- data.frame(dose=c("D0.5", "D1", "D2"),
len=c(4.2, 10, 29.5))
head(df)
## dose len
## 1 D0.5 4.2
## 2 D1 10.0
## 3 D2 29.5
df2 <- data.frame(supp=rep(c("VC", "OJ"), each=3),
dose=rep(c("D0.5", "D1", "D2"),2),
len=c(6.8, 15, 33, 4.2, 10, 29.5))
head(df2)
## supp dose len
## 1 VC D0.5 6.8
## 2 VC D1 15.0
## 3 VC D2 33.0
## 4 OJ D0.5 4.2
## 5 OJ D1 10.0
## 6 OJ D2 29.5
創(chuàng)建圖層
f <- ggplot(df, aes(x = dose, y = len))
f + geom_bar(stat = "identity")
修改填充色以及添加標(biāo)簽
f + geom_bar(stat="identity", fill="steelblue")+
geom_text(aes(label=len), vjust=-0.3, size=3.5)+
theme_minimal()
將dose映射給條形圖顏色
f + geom_bar(aes(color = dose),
stat="identity", fill="white")
修改填充色
f + geom_bar(aes(fill = dose), stat="identity")
將變量supp映射給填充色法希,從而達(dá)到分組效果
g <- ggplot(data=df2, aes(x=dose, y=len, fill=supp))
g + geom_bar(stat = "identity")#position默認(rèn)為stack
修改position為dodge
g + geom_bar(stat="identity", position=position_dodge())
兩個(gè)變量:x枷餐、y皆離散
使用數(shù)據(jù)集diamonds中的兩個(gè)離散變量color以及cut
ggplot(diamonds, aes(cut, color)) +
geom_jitter(aes(color = cut), size = 0.5)
兩個(gè)變量:繪制誤差圖
df <- ToothGrowth
df$dose <- as.factor(df$dose)
head(df)
## len supp dose
## 1 4.2 VC 0.5
## 2 11.5 VC 0.5
## 3 7.3 VC 0.5
## 4 5.8 VC 0.5
## 5 6.4 VC 0.5
## 6 10.0 VC 0.5
繪制誤差圖需要知道均值以及標(biāo)準(zhǔn)誤,下面這個(gè)函數(shù)用來(lái)計(jì)算每組的均值以及標(biāo)準(zhǔn)誤苫亦。
data_summary <- function(data, varname, grps){
require(plyr)
summary_func <- function(x, col){
c(mean = mean(x[[col]], na.rm=TRUE),
sd = sd(x[[col]], na.rm=TRUE))
}
data_sum<-ddply(data, grps, .fun=summary_func, varname)
data_sum <- rename(data_sum, c("mean" = varname))
return(data_sum)
}
計(jì)算均值以及標(biāo)準(zhǔn)誤
df2 <- data_summary(df, varname="len", grps= "dose")
# Convert dose to a factor variable
df2$dose=as.factor(df2$dose)
head(df2)
## dose len sd
## 1 0.5 10.605 4.499763
## 2 1 19.735 4.415436
## 3 2 26.100 3.774150
創(chuàng)建圖層
f <- ggplot(df2, aes(x = dose, y = len,
ymin = len-sd, ymax = len+sd))
可添加的圖層有:
- geom_crossbar(): 空心柱毛肋,上中下三線分別代表ymax、mean屋剑、ymin
- geom_errorbar(): 誤差棒
- geom_errorbarh(): 水平誤差棒
- geom_linerange():豎直誤差線
- geom_pointrange():中間為一點(diǎn)的誤差線
具體如下:
geom_crossbar()
f+geom_crossbar()
將dose映射給顏色
f+geom_crossbar(aes(color=dose))
自定義顏色
f+geom_crossbar(aes(color=dose))+
scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9"))+theme_classic()
修改填充色
f+geom_crossbar(aes(fill=dose))+
scale_fill_manual(values = c("#999999", "#E69F00", "#56B4E9"))+
theme_classic()
通過(guò)將supp映射給顏色實(shí)現(xiàn)分組润匙,可以利用函數(shù)stat_summary()來(lái)計(jì)算mean和sd
f <- ggplot(df, aes(x=dose, y=len, color=supp))
f+stat_summary(fun.data = mean_sdl, fun.args = list(mult=1), geom="crossbar", width=0.6, position = position_dodge(0.8))
誤差棒
f <- ggplot(df2, aes(x=dose, y=len, ymin=len-sd, ymax=len+sd))
將dose映射給顏色
f+geom_errorbar(aes(color=dose), width=0.2)
與線圖結(jié)合
f+geom_line(aes(group=1))+
geom_errorbar(width=0.15)
與條形圖結(jié)合,并將變量dose映射給顏色
f+geom_bar(aes(color=dose), stat = "identity", fill="white")+
geom_errorbar(aes(color=dose), width=0.1)
水平誤差棒
#構(gòu)造數(shù)據(jù)集
df2 <- data_summary(ToothGrowth, varname="len", grps = "dose")
df2$dose <- as.factor(df2$dose)
head(df2)
## dose len sd
## 1 0.5 10.605 4.499763
## 2 1 19.735 4.415436
## 3 2 26.100 3.774150
創(chuàng)建圖層
f <- ggplot(data = df2, aes(x=len, y=dose,xmin=len-sd, xmax=len+sd))
參數(shù)xmin與xmax用來(lái)設(shè)置水平誤差棒
f+geom_errorbarh()
通過(guò)映射實(shí)現(xiàn)分組
f+geom_errorbarh(aes(color=dose))
geom_linerange()與geom_pointrange()
f <- ggplot(df2, aes(x=dose, y=len, ymin=len-sd, ymax=len+sd))
line range
f+geom_linerange()
point range
f+geom_pointrange()
點(diǎn)圖+誤差棒
g <- ggplot(df, aes(x=dose, y=len))+
geom_dotplot(binaxis = "y", stackdir = "center")
添加geom_crossbar()
g+stat_summary(fun.data = mean_sdl, fun.args = list(mult=1), geom="crossbar", color="red", width=0.1)
添加geom_errorbar()
g + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1),
geom="errorbar", color="red", width=0.2) +
stat_summary(fun.y=mean, geom="point", color="red")
添加geom_pointrange()
g + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1),
geom="pointrange", color="red")
兩個(gè)變量:地圖繪制
ggplot2提供了繪制地圖的函數(shù)geom_map()
唉匾,依賴于包maps提供地理信息孕讳。
安裝map
install.paclages("maps")
下面將繪制美國(guó)地圖匠楚,數(shù)據(jù)集采用USArrests
library(maps)
head(USArrests)
## Murder Assault UrbanPop Rape
## Alabama 13.2 236 58 21.2
## Alaska 10.0 263 48 44.5
## Arizona 8.1 294 80 31.0
## Arkansas 8.8 190 50 19.5
## California 9.0 276 91 40.6
## Colorado 7.9 204 78 38.7
對(duì)數(shù)據(jù)進(jìn)行整理一下,添加一列state
crimes <- data.frame(state=tolower(rownames(USArrests)), USArrests)
head(crimes)
## Murder Assault UrbanPop Rape
## Alabama 13.2 236 58 21.2
## Alaska 10.0 263 48 44.5
## Arizona 8.1 294 80 31.0
## Arkansas 8.8 190 50 19.5
## California 9.0 276 91 40.6
## Colorado 7.9 204 78 38.7
#數(shù)據(jù)重鑄
library(reshape2)
crimesm <- melt(crimes, id=1)
head(crimesm)
## state variable value
## 1 alabama Murder 13.2
## 2 alaska Murder 10.0
## 3 arizona Murder 8.1
## 4 arkansas Murder 8.8
## 5 california Murder 9.0
## 6 colorado Murder 7.9
map_data <- map_data("state")
#繪制地圖,使用Murder進(jìn)行著色
ggplot(crimes, aes(map_id=state))+
geom_map(aes(fill=Murder), map=map_data)+
expand_limits(x=map_data$long, y=map_data$lat)
三個(gè)變量
使用數(shù)據(jù)集mtcars厂财,首先繪制一個(gè)相關(guān)性圖
#構(gòu)造數(shù)據(jù)
df <- mtcars[, c(1,3,4,5,6,7)]
head(df)
## mpg disp hp drat wt qsec
## Mazda RX4 21.0 160 110 3.90 2.620 16.46
## Mazda RX4 Wag 21.0 160 110 3.90 2.875 17.02
## Datsun 710 22.8 108 93 3.85 2.320 18.61
## Hornet 4 Drive 21.4 258 110 3.08 3.215 19.44
## Hornet Sportabout 18.7 360 175 3.15 3.440 17.02
## Valiant 18.1 225 105 2.76 3.460 20.22
cormat <- round(cor(df), 2)
cormat_melt <- melt(cormat)
head(cormat)
## mpg disp hp drat wt qsec
## mpg 1.00 -0.85 -0.78 0.68 -0.87 0.42
## disp -0.85 1.00 0.79 -0.71 0.89 -0.43
## hp -0.78 0.79 1.00 -0.45 0.66 -0.71
## drat 0.68 -0.71 -0.45 1.00 -0.71 0.09
## wt -0.87 0.89 0.66 -0.71 1.00 -0.17
## qsec 0.42 -0.43 -0.71 0.09 -0.17 1.00
創(chuàng)建圖層:
g <- ggplot(cormat_melt, aes(x=Var1, y=Var2))
在此基礎(chǔ)上可添加的圖層有:
- geom_tile(): 瓦片圖
- geom_raster(): 光柵圖芋簿,瓦片圖的一種,只不過(guò)所有的tiles都是一樣的大小
現(xiàn)在使用使用geom_tile()繪制相關(guān)性矩陣圖璃饱,我們這里這繪制下三角矩陣圖与斤,首先要整理數(shù)據(jù):
#獲得相關(guān)矩陣的下三角
get_lower_tri <- function(cormat){
cormat[upper.tri(cormat)] <- NA
return(cormat)
}
#獲得相關(guān)矩陣的上三角
get_upper_tri <- function(cormat){
cormat[lower.tri(cormat)] <- NA
return(cormat)
}
upper_tri <- get_upper_tri(cormat = cormat)
head(upper_tri)
## mpg disp hp drat wt qsec
## mpg 1 -0.85 -0.78 0.68 -0.87 0.42
## disp NA 1.00 0.79 -0.71 0.89 -0.43
## hp NA NA 1.00 -0.45 0.66 -0.71
## drat NA NA NA 1.00 -0.71 0.09
## wt NA NA NA NA 1.00 -0.17
## qsec NA NA NA NA NA 1.00
繪制相關(guān)矩陣圖
#數(shù)據(jù)重鑄
upper_tri_melt <- melt(upper_tri, na.rm = TRUE)
ggplot(data=upper_tri_melt, aes(Var1, y=Var2, fill=value))+
geom_tile(color="white")+
scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit=c(-1, 1), space = "Lab", name="Person\nCorrelation")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, vjust = 1, size = 12, hjust = 1))+
coord_fixed()
上圖中藍(lán)色代表互相關(guān),紅色代表正相關(guān)荚恶,至于coord_fixed()保證x撩穿,y軸比例為1
可以看出上圖順序有點(diǎn)亂,我們可以對(duì)相關(guān)矩陣進(jìn)行排序
#構(gòu)造函數(shù)
reorder_cormat <- function(cormat){
dd <- as.dist((1-cormat)/2)
hc <- hclust(dd)
cormat <- cormat[hc$order, hc$order]
}
cormat <- reorder_cormat(cormat)
lower_tri <- get_lower_tri(cormat)
lower_tri_melt <- melt(lower_tri, na.rm = TRUE)
head(lower_tri_melt)
## Var1 Var2 value
## 1 hp hp 1.00
## 2 disp hp 0.79
## 3 wt hp 0.66
## 4 qsec hp -0.71
## 5 mpg hp -0.78
## 6 drat hp -0.45
繪制圖形
ggheatmap <- ggplot(lower_tri_melt, aes(Var1, Var2, fill=value))+
geom_tile(color="white")+
scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit=c(-1, 1), space = "Lab", name="Person\nCorrelation")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, vjust = 1,
size = 12, hjust = 1))+
coord_fixed()
print(ggheatmap)
圖元:多邊形谒撼、路徑食寡、帶狀、射線(線段)嗤栓、矩形等
本節(jié)主要講述的是添加圖形元件冻河,將用到一下函數(shù):
- geom_polygon():添加多邊形
- geom_path(): 路徑
- geom_ribbon(): 帶狀
- geom_segment(): 射線、線段
- geom_curve(): 曲線
- geom_rect(): 二維矩形
添加多邊形
library(dplyr)
map_data("world")%>%
filter(region==c("China", "Taiwan"))%>%
ggplot(aes(x=long, y=lat, group=group))+
geom_polygon(fill="red", color="black")
添加路徑茉帅、帶狀叨叙、矩形
創(chuàng)建圖層
h <- ggplot(economics, aes(date, unemploy))
添加路徑
h+geom_path()
添加帶狀
h+geom_ribbon(aes(ymin=unemploy-800, ymax=unemploy+800), fill = "grey70")+geom_line(aes(y=unemploy))
添加矩形
h+
geom_path()+
geom_rect(aes(xmin=as.Date("1980-01-01"), ymin=-Inf, xmax=as.Date("1985-01-01"), ymax=Inf), fill="steelblue")
添加線段
i <- ggplot(mtcars, aes(wt, mpg))+geom_point()
#添加線段
i+geom_segment(aes(x=2, y=15, xend=3, yend=15))
添加箭頭
i+geom_segment(aes(x=5, y=30, xend=3.5, yend=25), arrow = arrow(length = unit(0.5, "cm")))
添加曲線
i+geom_curve(aes(x=2, y=15, xend=3, yend=15), color="red")
圖形參數(shù):主標(biāo)題、坐標(biāo)軸標(biāo)簽堪澎、圖例標(biāo)題
創(chuàng)建圖層
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p <- ggplot(ToothGrowth, aes(x=dose, y=len))+geom_boxplot()
修改標(biāo)題以及標(biāo)簽的函數(shù)有:
- ggtitle("New main title"): 添加主標(biāo)題
- xlab(“New X axis label”): 修改x軸標(biāo)簽
- ylab(“New Y axis label”): 修改y軸標(biāo)簽
- labs(title = “New main title”, x = “New X axis label”, y = “New Y axis label”): 可同時(shí)添加主標(biāo)題以及坐標(biāo)軸標(biāo)簽擂错,另外,圖例標(biāo)題也可以用此函數(shù)修改
修改主標(biāo)題以及標(biāo)簽
(p <- p+labs(title="Plot of length\nby dose", x="Dose (mg)", y="teeth length"))
修改標(biāo)簽屬性:顏色樱蛤、字體钮呀、大小等
使用theme()修改,element_text()可以具體修改圖形參數(shù),element_blank()隱藏標(biāo)簽
#修改標(biāo)簽
p+theme(
plot.title = element_text(color = "red", size = 14, face = "bold.italic"),
axis.title.x = element_text(color="blue", size = 14, face = "bold"),
axis.title.y = element_text(color="#993333", size = 14, face = "bold")
)
#隱藏標(biāo)簽
p+theme(
plot.title = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank()
)
修改圖例標(biāo)題
p <- ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose))+
geom_boxplot()
p
#修改圖例標(biāo)題
p+labs(fill="Dose (mg)")
圖例位置以及外觀
修改圖例位置以及外觀
#圖例位置在最上面昨凡,有五個(gè)選項(xiàng):"left","top", "right", "bottom", "none"
p+theme(legend.position = "top")
移除圖例
p+theme(legend.position = "none")
修改圖例標(biāo)題以及標(biāo)簽外觀
p+theme(
legend.title = element_text(color="blue"),
legend.text = element_text(color="red")
)
修改圖例背景
p+theme(legend.background = element_rect(fill="lightblue"))
利用scale()函數(shù)自定義圖例
主要兩個(gè)函數(shù):
- scale_x_discrete():修改圖例標(biāo)簽順序
- scale_fill_discrete(): 修改圖例標(biāo)題以及標(biāo)簽
#修改順序
p+scale_x_discrete(limits=c("2", "0.5", "1"))
#修改標(biāo)題以及標(biāo)簽
p+scale_fill_discrete(name="Dose", label=c("A","B","C"))
自動(dòng)/手動(dòng)修改顏色
mtcars$cyl <- as.factor(mtcars$cyl)
創(chuàng)建圖層
# boxplot
bp <- ggplot(ToothGrowth, aes(x=dose, y=len))
# scatter plot
sp <- ggplot(mtcars, aes(x=wt, y=mpg))
修改填充色爽醋、輪廓線顏色
bp+geom_boxplot(fill="steelblue", color="red")
sp+geom_point(color="darkblue")
通過(guò)映射分組修改顏色
(bp <- bp+geom_boxplot(aes(fill=dose)))
(sp <- sp+geom_point(aes(color=cyl)))
手動(dòng)修改顏色
主要兩個(gè)函數(shù):
- scale_fill_manual(): 填充色
- scale_color_manual():輪廓色,如點(diǎn)線
# Box plot
bp + scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))
# Scatter plot
sp + scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))
使用RColorBrewer調(diào)色板
- scale_fill_brewer(): 填充色
- scale_color_brewer():輪廓色便脊,如點(diǎn)線
# Box plot
bp + scale_fill_brewer(palette="Dark2")
# Scatter plot
sp + scale_color_brewer(palette="Dark2")
RColorBrewer包提供以下調(diào)色板
還專門(mén)有一個(gè)灰度調(diào)色板:
# Box plot
bp + scale_fill_grey() + theme_classic()
# Scatter plot
sp + scale_color_grey() + theme_classic()
梯度或連續(xù)顏色
有時(shí)我們會(huì)將某個(gè)連續(xù)變量映射給顏色蚂四,這時(shí)修改這種梯度或連續(xù)型顏色就可以使用以下函數(shù):
- scale_color_gradient(), scale_fill_gradient():兩種顏色的連續(xù)梯度
- scale_color_gradient2(), scale_fill_gradient2():不同梯度
- scale_color_gradientn(), scale_fill_gradientn():多種顏色梯度
# Color by qsec values
sp2<-ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point(aes(color = qsec))
sp2
# Change the low and high colors
# Sequential color scheme
sp2+scale_color_gradient(low="blue", high="red")
# Diverging color scheme
mid<-mean(mtcars$qsec)
sp2+scale_color_gradient2(midpoint=mid, low="blue", mid="white",
high="red", space = "Lab" )
點(diǎn)顏色、大小哪痰、形狀
R提供的點(diǎn)形狀是由數(shù)字表示的遂赠,具體如下:
# Basic scatter plot
ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point(shape = 18, color = "steelblue", size = 4)
# Change point shapes and colors by groups
ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point(aes(shape = cyl, color = cyl))
可通過(guò)以下方法對(duì)點(diǎn)的顏色、大小晌杰、形狀進(jìn)行修改:
- scale_shape_manual() : to change point shapes
- scale_color_manual() : to change point colors
- scale_size_manual() : to change the size of points
# Change colors and shapes manually
ggplot(mtcars, aes(x=wt, y=mpg, group=cyl)) +
geom_point(aes(shape=cyl, color=cyl), size=2)+
scale_shape_manual(values=c(3, 16, 17))+
scale_color_manual(values=c('#999999','#E69F00', '#56B4E9'))+
theme(legend.position="top")
文本注釋
對(duì)圖形進(jìn)行文本注釋有以下方法:
- geom_text(): 文本注釋
- geom_label(): 文本注釋,類(lèi)似于geom_text(),只是多了個(gè)背景框
- annotate(): 文本注釋
- annotation_custom(): 分面時(shí)可以在所有的面板進(jìn)行文本注釋
set.seed(1234)
df <- mtcars[sample(1:nrow(mtcars), 10), ]
df$cyl <- as.factor(df$cyl)
散點(diǎn)圖注釋
# Scatter plot
sp <- ggplot(df, aes(x=wt, y=mpg))+ geom_point()
# Add text, change colors by groups
sp + geom_text(aes(label = rownames(df), color = cyl),
size = 3, vjust = -1)
# Add text at a particular coordinate
sp + geom_text(x = 3, y = 30, label = "Scatter plot",
color="red")
# geom_label()進(jìn)行注釋
sp + geom_label(aes(label=rownames(df)))
# annotation_custom(),需要用到textGrob()
library(grid)
# Create a text
grob <- grobTree(textGrob("Scatter plot", x=0.1, y=0.95, hjust=0,
gp=gpar(col="red", fontsize=13, fontface="italic")))
# Plot
sp + annotation_custom(grob)
#分面注釋
sp + annotation_custom(grob)+facet_wrap(~cyl, scales="free")
線型
R里的線型有七種:“blank”, “solid”, “dashed”, “dotted”, “dotdash”, “l(fā)ongdash”, “twodash”跷睦,對(duì)應(yīng)數(shù)字0,1肋演,2抑诸,3烂琴,4,5哼鬓,6.
具體如下:
# Create some data
df2 <- data.frame(sex = rep(c("Female", "Male"), each=3),
time=c("breakfeast", "Lunch", "Dinner"),
bill=c(10, 30, 15, 13, 40, 17) )
head(df2)
## sex time bill
## 1 Female breakfeast 10
## 2 Female Lunch 30
## 3 Female Dinner 15
## 4 Male breakfeast 13
## 5 Male Lunch 40
## 6 Male Dinner 17
# Line plot with multiple groups
# Change line types and colors by groups (sex)
ggplot(df2, aes(x=time, y=bill, group=sex)) +
geom_line(aes(linetype = sex, color = sex))+
geom_point(aes(color=sex))+
theme(legend.position="top")
同點(diǎn)一樣监右,線也可以類(lèi)似修改:
- scale_linetype_manual() : to change line types
- scale_color_manual() : to change line colors
- scale_size_manual() : to change the size of lines
# Change line types, colors and sizes
ggplot(df2, aes(x=time, y=bill, group=sex)) +
geom_line(aes(linetype=sex, color=sex, size=sex))+
geom_point()+
scale_linetype_manual(values=c("twodash", "dotted"))+
scale_color_manual(values=c('#999999','#E69F00'))+
scale_size_manual(values=c(1, 1.5))+
theme(legend.position="top")
主題與背景顏色
# Convert the column dose from numeric to factor variable
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
創(chuàng)建箱線圖
p <- ggplot(ToothGrowth, aes(x=dose, y=len))+
geom_boxplot()
修改主題
ggplot2提供了好幾種主題边灭,另外有一個(gè)擴(kuò)展包ggthemes專門(mén)提供了一主題异希,可以安裝利用。
install.packages("ggthemes")
- theme_gray(): gray background color and white grid lines
- theme_bw() : white background and gray grid lines
p+theme_gray(base_size = 14)
p+theme_bw()
- theme_linedraw : black lines around the plot
- theme_light : light gray lines and axis (more attention towards the data)
p + theme_linedraw()
p + theme_light()
- theme_minimal: no background annotations
- theme_classic : theme with axis lines and no grid lines
p + theme_minimal()
p + theme_classic()
ggthemes提供的主題
p+ggthemes::theme_economist()
坐標(biāo)軸:最大最小值
p <- ggplot(cars, aes(x=speed, y=dist))+geom_point()
修改坐標(biāo)軸范圍有以下幾種方式:
1绒瘦、不刪除數(shù)據(jù)
- p+coord_cartesian(xlim=c(5, 20), ylim=c(0, 50)):笛卡爾坐標(biāo)系称簿,這是設(shè)定修改不會(huì)刪除數(shù)據(jù)
2、會(huì)刪除部分?jǐn)?shù)據(jù):不在此范圍內(nèi)的數(shù)據(jù)都會(huì)被刪除,因此在此基礎(chǔ)上添加圖層時(shí)數(shù)據(jù)是不完整的
- p+xlim(5, 20)+ylim(0, 50)
- p+scale_x_continuous(limits=c(5, 20))+scale_y_continuous(limits=c(0, 50))
3惰帽、擴(kuò)展圖形范圍:expand()函數(shù)憨降,擴(kuò)大范圍
- p+expand_limits(x=0, y=0):設(shè)置截距為0,即過(guò)原點(diǎn)
- p+expand_limits(x=c(5, 50), y=c(0, 150)):擴(kuò)大坐標(biāo)軸范圍该酗,這樣圖形顯示就小了
下面通過(guò)圖形演示
p
#通過(guò)coord_cartesian()函數(shù)修改坐標(biāo)軸范圍
p+coord_cartesian(xlim =c (5, 20), ylim = c(0, 50))
#通過(guò)xlim()和ylim()函數(shù)修改
p+xlim(5, 20)+ylim(0, 50)
#expand limits
p+expand_limits(x=c(5, 50), y=c(0, 150))
坐標(biāo)變換
p <- ggplot(cars, aes(x=speed, y=dist))+geom_point()
坐標(biāo)變換有以下幾種:
- p+scale_x_log10(),p+scale_y_log10(): 繪圖時(shí)對(duì)x授药,y取10的對(duì)數(shù)
- p+scale_x_sqrt(),p+scale_x_sqrt(): 開(kāi)根號(hào)
- p+scale_x_reverse(),p+scale_x_reverse():坐標(biāo)軸反向
- p+coord_trans(x =“l(fā)og10”, y=“l(fā)og10”): 同上,可以對(duì)坐標(biāo)軸取對(duì)數(shù)呜魄、根號(hào)等
- p+scale_x_continuous(trans="log2"),p+scale_x_continuous(trans="log2"): 同上悔叽,取對(duì)數(shù)的另外一種方法
下面實(shí)例演示:
p
p+scale_x_continuous(trans = "log2")+
scale_y_continuous(trans = "log2")
#修改坐標(biāo)刻度標(biāo)簽
require(scales)
p+scale_y_continuous(trans=log2_trans(),
breaks = trans_breaks("log2", function(x) 2^x),
labels=trans_format("log2", math_format(2^.x)))
#坐標(biāo)軸反向
p+scale_y_reverse()
坐標(biāo)刻度:刻度線、標(biāo)簽爵嗅、順序等
更改坐標(biāo)軸刻度線標(biāo)簽等函數(shù):
- element_text(face, color, size, angle): 修改文本風(fēng)格
- element_blank(): 隱藏文本
(p <- ggplot(ToothGrowth, aes(x=dose, y=len))+geom_boxplot())
修改刻度標(biāo)簽等
p+theme(axis.text.x = element_text(face = "bold", color="#993333", size=14, angle = 45),
axis.text.y = element_text(face = "bold", size = 14, color = "blue", angle = 45))
移除刻度標(biāo)簽等
p + theme(
axis.text.x = element_blank(), # Remove x axis tick labels
axis.text.y = element_blank(), # Remove y axis tick labels
axis.ticks = element_blank()) # Remove ticks
當(dāng)然可以自定義坐標(biāo)軸了
-
離散非連續(xù)坐標(biāo)軸
- scale_x_discrete(name, breaks, labels, limits)
- scale_y_discrete(name, breaks, labels, limits)
-
連續(xù)型坐標(biāo)軸
- scale_x_conyinuous(name, breaks, labels, limits)
- scale_y_continuous(name, breaks, labels, limits)
詳細(xì)情況如下:
- name: x,y軸的標(biāo)題
- breaks: 刻度娇澎,分成幾段
- labels:坐標(biāo)軸刻度線標(biāo)簽
- limits: 坐標(biāo)軸范圍
其中scale_xx()函數(shù)可以修改坐標(biāo)軸的如下參數(shù):
- 坐標(biāo)軸標(biāo)題
- 坐標(biāo)軸范圍
- 刻度標(biāo)簽位置
- 手動(dòng)設(shè)置刻度標(biāo)簽
具體演示:
- 離散坐標(biāo)軸
#修改標(biāo)簽以及順序
p+scale_x_discrete(name="Dose (mg)", limits=c("2", "1", "0.5"))
#修改刻度標(biāo)簽
p+scale_x_discrete(breaks=c("0.5", "1", "2"),labels=c("Dose 0.5", "Dose 1", "Dose 2"))
#修改要顯示的項(xiàng)
p+scale_x_discrete(limits=c("0.5", "2"))
- 連續(xù)型坐標(biāo)軸
#散點(diǎn)圖
(sp <- ggplot(cars, aes(x=speed, y=dist))+geom_point())
修改坐標(biāo)軸標(biāo)簽以及范圍
(sp <- sp+scale_x_continuous(name = "Speed of cars", limits = c(0, 30))+
scale_y_continuous(name = "Stopping distance", limits = c(0, 150)))
更改y軸刻度,間隔50
sp+scale_y_continuous(breaks = seq(0, 150, 50))
修改y軸標(biāo)簽為百分?jǐn)?shù)
require(scales)
sp+scale_y_continuous(labels = percent)
添加直線:水平線睹晒、豎直線趟庄、回歸線
ggplot2提供以下方法為圖形添加直線:
- geom_hline(yintercept, linetype, color, size): 添加水平線
- geom_vline(xintercept, linetype, color, size):添加豎直線
- geom_abline(intercept, slope, linetype, color, size):添加回歸線
- geom_segment():添加線段
實(shí)例演示:
sp <- ggplot(data=mtcars, aes(x=wt, y=mpg))+ geom_point()
添加直線:
#在y=20處添加一水平線,并設(shè)置顏色等
sp+geom_hline(yintercept = 20, linetype="dashed", color='red')
#在x=3處添加一豎直線伪很,并設(shè)置顏色等
sp+geom_vline(xintercept = 3, color="blue", size=1.5)
#添加回歸線
sp+geom_abline(intercept = 37, slope = -5, color="blue")
#添加水平線段
sp+geom_segment(aes(x=2, y=15, xend=3, yend=15), color="red")
圖形旋轉(zhuǎn):旋轉(zhuǎn)戚啥、反向
主要是下面兩個(gè)函數(shù):
- coord_flip():創(chuàng)建水平方向圖
- scale_x_reverse(),scale_y_reverse():坐標(biāo)軸反向
set.seed(1234)
(hp <- qplot(x=rnorm(200), geom = "histogram"))
#水平柱形圖
hp+coord_flip()
#y軸反向
hp+scale_y_reverse()
分面
分面就是根據(jù)一個(gè)或多個(gè)變量將圖形分為幾個(gè)圖形以便于可視化,主要有兩個(gè)方法實(shí)現(xiàn):
- facet_grid()
- facet_wrap()
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
(p <- ggplot(ToothGrowth, aes(x=dose, y=len, group=dose))+
geom_boxplot(aes(fill=dose)))
針對(duì)上面圖形進(jìn)行分面:
- p+facet_grid(supp~.): 按變量supp進(jìn)行豎直方向分面
- p+facet_grid(.~supp): 按變量supp進(jìn)行水平方向分面
- p+facet_wrap(dose~supp):按雙變量supp和dose進(jìn)行水平豎直方向分面
- p+facet_wrap(~fl): 將分成的面板邊靠邊置于一個(gè)矩形框內(nèi)
1锉试、按一個(gè)離散變量進(jìn)行分面:
#豎直方向進(jìn)行分面
p+facet_grid(supp~.)
#水平方向分面
p+facet_grid(.~supp)
2猫十、按兩個(gè)離散變量進(jìn)行分面
#行按dose分面,列按supp分面
p+facet_grid(dose~supp)
#行按supp键痛,列按dose分面
p+facet_grid(supp~dose)
從上面圖形可以看出炫彩,每個(gè)面板的坐標(biāo)軸比例都是一樣的,我們可以通過(guò)設(shè)置參數(shù)scales來(lái)控制坐標(biāo)軸比例
p + facet_grid(dose ~ supp, scales='free')
位置調(diào)整
很多圖形需要我們調(diào)整位置絮短,比如直方圖時(shí)江兢,由堆疊式、百分式丁频、分離式等杉允,具體的要通過(guò)實(shí)例說(shuō)明
p <- ggplot(mpg, aes(fl, fill=drv))
#直方圖邊靠邊排列邑贴,參數(shù)position="dodge"
p+geom_bar(position = "dodge")
堆疊式position="stack"
p+geom_bar(position = "stack")
position="fill"類(lèi)似玉堆疊圖,只不過(guò)按百分比排列叔磷,所有柱子都被標(biāo)準(zhǔn)化成同樣高度
p+geom_bar(position = "fill")
position="jitter",(主要適用于散點(diǎn)圖)增加擾動(dòng)拢驾,避免重疊,前面講的geom_jitter()就是來(lái)源于此
ggplot(mpg, aes(cty, hwy))+
geom_point(position = "jitter")
上面幾個(gè)函數(shù)有兩個(gè)重要的參數(shù):heigth改基、weight繁疤。
- position_dodge(width, height)
- position_fill(width, height)
- position_stack(width, height)
- position_jitter(width, height)
p+geom_bar(position = position_dodge(width = 1))
坐標(biāo)系
p <- ggplot(mpg, aes(fl))+geom_bar()
ggplot2中的坐標(biāo)系主要有:
- p+coord_cartesian(xlim=NULL, ylim=NULL):笛卡爾坐標(biāo)系(默認(rèn))
- p+coord_fixed(ratio=1, clim=NULL, ylim=NULL):固定了坐標(biāo)軸比例的笛卡爾坐標(biāo)系。默認(rèn)比例為1
- p+coord_flip(...):旋轉(zhuǎn)笛卡爾坐標(biāo)系
- p+coord_polar(theta="x", start=0, direction=1):極坐標(biāo)系
- p+coord_trans(x,y,limx,limy):變換笛卡爾坐標(biāo)系
- coord_map():地圖坐標(biāo)系
各個(gè)坐標(biāo)系參數(shù)如下:
1秕狰、笛卡爾坐標(biāo)系:coord_cartesian(), coord_fixed() and coord_flip()
- xlim:x軸范圍
- ylim:y軸范圍
- ratio:y/x
- ...:其他參數(shù)
2稠腊、極坐標(biāo)系:coord_polar()
- theta:外延坐標(biāo),x或y
- start:坐標(biāo)開(kāi)始的位置鸣哀,默認(rèn)為12點(diǎn)鐘
- direction:方向:順時(shí)針(1),逆時(shí)針(-1)
3架忌、變換坐標(biāo)系:coord_trans()
- x,y:變換的坐標(biāo)軸
- limx,limy:坐標(biāo)軸范圍
實(shí)例演示:
p+coord_cartesian(ylim = c(0,200))
p+coord_fixed(ratio = 1/50)
p+coord_flip()
p+coord_polar(theta = "x", direction = 1)
p+coord_trans(y="sqrt")
ggplot2包資料擴(kuò)展:包、函數(shù)
- ggplot2有一個(gè)官方網(wǎng)站我衬,里面有十分詳細(xì)的說(shuō)明叹放,點(diǎn)擊這里直達(dá)
- ggplot2還有十分多的擴(kuò)展包,點(diǎn)擊這里直達(dá)
SessionInfo
sessionInfo()
## R version 3.4.1 (2017-06-30)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.3 LTS
##
## Matrix products: default
## BLAS: /usr/lib/atlas-base/atlas/libblas.so.3.0
## LAPACK: /usr/lib/atlas-base/atlas/liblapack.so.3.0
##
## locale:
## [1] LC_CTYPE=zh_CN.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=zh_CN.UTF-8 LC_COLLATE=zh_CN.UTF-8
## [5] LC_MONETARY=zh_CN.UTF-8 LC_MESSAGES=zh_CN.UTF-8
## [7] LC_PAPER=zh_CN.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=zh_CN.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] grid stats graphics grDevices utils datasets methods
## [8] base
##
## other attached packages:
## [1] scales_0.5.0 bindrcpp_0.2 dplyr_0.7.3 reshape2_1.4.2
## [5] maps_3.2.0 hexbin_1.27.1 plyr_1.8.4 ggplot2_2.2.1
##
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.12 bindr_0.1 compiler_3.4.1
## [4] RColorBrewer_1.1-2 base64enc_0.1-3 tools_3.4.1
## [7] rpart_4.1-11 digest_0.6.12 checkmate_1.8.3
## [10] htmlTable_1.9 evaluate_0.10.1 tibble_1.3.4
## [13] gtable_0.2.0 lattice_0.20-35 pkgconfig_2.0.1
## [16] rlang_0.1.2 Matrix_1.2-11 yaml_2.1.14
## [19] gridExtra_2.3 stringr_1.2.0 knitr_1.17
## [22] cluster_2.0.6 htmlwidgets_0.9 rprojroot_1.2
## [25] nnet_7.3-12 glue_1.1.1 data.table_1.10.4
## [28] R6_2.2.2 survival_2.41-3 foreign_0.8-69
## [31] rmarkdown_1.6 latticeExtra_0.6-28 Formula_1.2-2
## [34] magrittr_1.5 ggthemes_3.4.0 backports_1.1.0
## [37] Hmisc_4.0-3 htmltools_0.3.6 MASS_7.3-47
## [40] splines_3.4.1 assertthat_0.2.0 colorspace_1.3-2
## [43] labeling_0.3 stringi_1.1.5 acepack_1.4.1
## [46] lazyeval_0.2.0 munsell_0.4.3