ggplot2高效實(shí)用指南

mark

簡(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")
mark

與點(diǎn)圖結(jié)合

e + geom_jitter(position=position_jitter(0.2)) + 
  geom_dotplot(binaxis = "y", stackdir = "center") 
mark

與小提琴圖結(jié)合

e + geom_violin(trim = FALSE) +
  geom_jitter(position=position_jitter(0.2))
mark

將dose映射給顏色和形狀

e +  geom_jitter(aes(color = dose, shape = dose),
                 position=position_jitter(0.2))
mark

線圖

#構(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()
mark

修改線型、點(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))
mark

條形圖

#構(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")
mark

修改填充色以及添加標(biāo)簽

f + geom_bar(stat="identity", fill="steelblue")+
  geom_text(aes(label=len), vjust=-0.3, size=3.5)+
  theme_minimal()
mark

將dose映射給條形圖顏色

f + geom_bar(aes(color = dose),
             stat="identity", fill="white")
mark

修改填充色

f + geom_bar(aes(fill = dose), stat="identity")
mark

將變量supp映射給填充色法希,從而達(dá)到分組效果

g <- ggplot(data=df2, aes(x=dose, y=len, fill=supp)) 
g + geom_bar(stat = "identity")#position默認(rèn)為stack
mark

修改position為dodge

g + geom_bar(stat="identity", position=position_dodge())
mark

兩個(gè)變量:x枷餐、y皆離散

使用數(shù)據(jù)集diamonds中的兩個(gè)離散變量color以及cut

ggplot(diamonds, aes(cut, color)) +
  geom_jitter(aes(color = cut), size = 0.5)
mark

兩個(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()
mark

將dose映射給顏色

f+geom_crossbar(aes(color=dose))
mark

自定義顏色

f+geom_crossbar(aes(color=dose))+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9"))+theme_classic()
mark

修改填充色

f+geom_crossbar(aes(fill=dose))+
  scale_fill_manual(values = c("#999999", "#E69F00", "#56B4E9"))+
  theme_classic()
mark

通過(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))
mark

誤差棒

f <- ggplot(df2, aes(x=dose, y=len, ymin=len-sd, ymax=len+sd))

將dose映射給顏色

f+geom_errorbar(aes(color=dose), width=0.2)
mark

與線圖結(jié)合

f+geom_line(aes(group=1))+
  geom_errorbar(width=0.15)
mark

與條形圖結(jié)合,并將變量dose映射給顏色

f+geom_bar(aes(color=dose), stat = "identity", fill="white")+
  geom_errorbar(aes(color=dose), width=0.1)
mark

水平誤差棒

#構(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()
mark

通過(guò)映射實(shí)現(xiàn)分組

f+geom_errorbarh(aes(color=dose))
mark

geom_linerange()與geom_pointrange()

f <- ggplot(df2, aes(x=dose, y=len, ymin=len-sd, ymax=len+sd))

line range

f+geom_linerange()
mark

point range

f+geom_pointrange()
mark

點(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)
mark

添加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")
mark

添加geom_pointrange()

g + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange", color="red")
mark

兩個(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)
mark

三個(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()
mark

上圖中藍(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)
mark

圖元:多邊形谒撼、路徑食寡、帶狀、射線(線段)嗤栓、矩形等

本節(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")
mark

添加路徑茉帅、帶狀叨叙、矩形

創(chuàng)建圖層

h <- ggplot(economics, aes(date, unemploy))

添加路徑

h+geom_path()
mark

添加帶狀

h+geom_ribbon(aes(ymin=unemploy-800, ymax=unemploy+800), fill = "grey70")+geom_line(aes(y=unemploy))
mark

添加矩形

h+
  geom_path()+
  geom_rect(aes(xmin=as.Date("1980-01-01"), ymin=-Inf, xmax=as.Date("1985-01-01"), ymax=Inf), fill="steelblue")
mark

添加線段

i <- ggplot(mtcars, aes(wt, mpg))+geom_point()
#添加線段
i+geom_segment(aes(x=2, y=15, xend=3, yend=15))
mark

添加箭頭

i+geom_segment(aes(x=5, y=30, xend=3.5, yend=25), arrow = arrow(length = unit(0.5, "cm")))
mark

添加曲線

i+geom_curve(aes(x=2, y=15, xend=3, yend=15), color="red")
mark

圖形參數(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"))
mark

修改標(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")
)
mark
#隱藏標(biāo)簽
p+theme(
  plot.title = element_blank(),
  axis.title.x = element_blank(),
  axis.title.y = element_blank()
)
mark

修改圖例標(biāo)題

p <- ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose))+
  geom_boxplot()
p
mark
#修改圖例標(biāo)題
p+labs(fill="Dose (mg)")
mark

圖例位置以及外觀

修改圖例位置以及外觀

#圖例位置在最上面昨凡,有五個(gè)選項(xiàng):"left","top", "right", "bottom", "none"
p+theme(legend.position = "top")
mark

移除圖例

p+theme(legend.position = "none")
mark

修改圖例標(biāo)題以及標(biāo)簽外觀

p+theme(
  legend.title = element_text(color="blue"),
  legend.text = element_text(color="red")
)
mark

修改圖例背景

p+theme(legend.background = element_rect(fill="lightblue"))
mark

利用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"))
mark
#修改標(biāo)題以及標(biāo)簽
p+scale_fill_discrete(name="Dose", label=c("A","B","C"))
mark

自動(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")
mark
sp+geom_point(color="darkblue")
mark

通過(guò)映射分組修改顏色

(bp <- bp+geom_boxplot(aes(fill=dose)))
mark
(sp <- sp+geom_point(aes(color=cyl)))
mark

手動(dòng)修改顏色

主要兩個(gè)函數(shù):

  • scale_fill_manual(): 填充色
  • scale_color_manual():輪廓色,如點(diǎn)線
# Box plot
bp + scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))
mark
# Scatter plot
sp + scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))
mark

使用RColorBrewer調(diào)色板

  • scale_fill_brewer(): 填充色
  • scale_color_brewer():輪廓色便脊,如點(diǎn)線
# Box plot
bp + scale_fill_brewer(palette="Dark2")
mark
# Scatter plot
sp + scale_color_brewer(palette="Dark2")
mark

RColorBrewer包提供以下調(diào)色板

還專門(mén)有一個(gè)灰度調(diào)色板:

# Box plot
bp + scale_fill_grey() + theme_classic()
mark
# Scatter plot
sp + scale_color_grey() + theme_classic()
mark

梯度或連續(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
mark
# Change the low and high colors
# Sequential color scheme
sp2+scale_color_gradient(low="blue", high="red")
mark
# Diverging color scheme
mid<-mean(mtcars$qsec)
sp2+scale_color_gradient2(midpoint=mid, low="blue", mid="white",
                          high="red", space = "Lab" )
mark

點(diǎn)顏色、大小哪痰、形狀

R提供的點(diǎn)形狀是由數(shù)字表示的遂赠,具體如下:

# Basic scatter plot
ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_point(shape = 18, color = "steelblue", size = 4)
mark
# Change point shapes and colors by groups
ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point(aes(shape = cyl, color = cyl))
mark

可通過(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")
mark

文本注釋

對(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)
mark
# Add text at a particular coordinate
sp + geom_text(x = 3, y = 30, label = "Scatter plot",
              color="red")
mark
# geom_label()進(jìn)行注釋
sp + geom_label(aes(label=rownames(df)))
mark
# 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)
mark
#分面注釋
sp + annotation_custom(grob)+facet_wrap(~cyl, scales="free")
mark

線型

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

同點(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")
mark

主題與背景顏色

# 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)
mark
p+theme_bw()
mark
  • theme_linedraw : black lines around the plot
  • theme_light : light gray lines and axis (more attention towards the data)
p + theme_linedraw()
mark
p + theme_light()
mark
  • theme_minimal: no background annotations
  • theme_classic : theme with axis lines and no grid lines
p + theme_minimal()
mark
p + theme_classic()
mark

ggthemes提供的主題

p+ggthemes::theme_economist()
mark

坐標(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
mark
#通過(guò)coord_cartesian()函數(shù)修改坐標(biāo)軸范圍
p+coord_cartesian(xlim =c (5, 20), ylim = c(0, 50))
mark
#通過(guò)xlim()和ylim()函數(shù)修改
p+xlim(5, 20)+ylim(0, 50)
mark
#expand limits
p+expand_limits(x=c(5, 50), y=c(0, 150))
mark

坐標(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
mark
p+scale_x_continuous(trans = "log2")+
  scale_y_continuous(trans = "log2")
mark
#修改坐標(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)))
mark
#坐標(biāo)軸反向
p+scale_y_reverse()
mark

坐標(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())
mark

修改刻度標(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))
mark

移除刻度標(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
mark

當(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"))
mark
#修改刻度標(biāo)簽
p+scale_x_discrete(breaks=c("0.5", "1", "2"),labels=c("Dose 0.5", "Dose 1", "Dose 2"))
mark
#修改要顯示的項(xiàng)
p+scale_x_discrete(limits=c("0.5", "2"))
mark
  • 連續(xù)型坐標(biāo)軸
#散點(diǎn)圖
(sp <- ggplot(cars, aes(x=speed, y=dist))+geom_point())
mark

修改坐標(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)))
mark

更改y軸刻度,間隔50

sp+scale_y_continuous(breaks = seq(0, 150, 50))
mark

修改y軸標(biāo)簽為百分?jǐn)?shù)

require(scales)
sp+scale_y_continuous(labels = percent)
mark

添加直線:水平線睹晒、豎直線趟庄、回歸線

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')
mark
#在x=3處添加一豎直線伪很,并設(shè)置顏色等
sp+geom_vline(xintercept = 3, color="blue", size=1.5)
mark
#添加回歸線
sp+geom_abline(intercept = 37, slope = -5, color="blue")
mark
#添加水平線段
sp+geom_segment(aes(x=2, y=15, xend=3, yend=15), color="red")
mark

圖形旋轉(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"))
mark
#水平柱形圖
hp+coord_flip()
mark
#y軸反向
hp+scale_y_reverse()
mark

分面

分面就是根據(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)))
mark

針對(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~.)
mark
#水平方向分面
p+facet_grid(.~supp)
mark

2猫十、按兩個(gè)離散變量進(jìn)行分面

#行按dose分面,列按supp分面
p+facet_grid(dose~supp)
mark
#行按supp键痛,列按dose分面
p+facet_grid(supp~dose)
mark

從上面圖形可以看出炫彩,每個(gè)面板的坐標(biāo)軸比例都是一樣的,我們可以通過(guò)設(shè)置參數(shù)scales來(lái)控制坐標(biāo)軸比例

p + facet_grid(dose ~ supp, scales='free')
mark

位置調(diào)整

很多圖形需要我們調(diào)整位置絮短,比如直方圖時(shí)江兢,由堆疊式、百分式丁频、分離式等杉允,具體的要通過(guò)實(shí)例說(shuō)明

p <- ggplot(mpg, aes(fl, fill=drv))
#直方圖邊靠邊排列邑贴,參數(shù)position="dodge"
p+geom_bar(position = "dodge")
mark

堆疊式position="stack"

p+geom_bar(position = "stack")
mark

position="fill"類(lèi)似玉堆疊圖,只不過(guò)按百分比排列叔磷,所有柱子都被標(biāo)準(zhǔn)化成同樣高度

p+geom_bar(position = "fill")
mark

position="jitter",(主要適用于散點(diǎn)圖)增加擾動(dòng)拢驾,避免重疊,前面講的geom_jitter()就是來(lái)源于此

ggplot(mpg, aes(cty, hwy))+
  geom_point(position = "jitter")
mark

上面幾個(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))
mark

坐標(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))
mark
p+coord_fixed(ratio = 1/50)
mark
p+coord_flip()
mark
p+coord_polar(theta = "x", direction = 1)
mark
p+coord_trans(y="sqrt")
mark

ggplot2包資料擴(kuò)展:包、函數(shù)

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挠羔,一起剝皮案震驚了整個(gè)濱河市井仰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褥赊,老刑警劉巖糕档,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拌喉,居然都是意外死亡速那,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)尿背,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)端仰,“玉大人,你說(shuō)我怎么就攤上這事田藐±笊眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵汽久,是天一觀的道長(zhǎng)鹤竭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)景醇,這世上最難降的妖魔是什么臀稚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮三痰,結(jié)果婚禮上吧寺,老公的妹妹穿的比我還像新娘窜管。我一直安慰自己,他們只是感情好稚机,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布幕帆。 她就那樣靜靜地躺著,像睡著了一般失乾。 火紅的嫁衣襯著肌膚如雪募壕。 梳的紋絲不亂的頭發(fā)上干毅,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音额各,去河邊找鬼呻引。 笑死,一個(gè)胖子當(dāng)著我的面吹牛琅豆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隶垮,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼良瞧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了训唱?” 一聲冷哼從身側(cè)響起褥蚯,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎况增,沒(méi)想到半個(gè)月后赞庶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巡通,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年尘执,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宴凉。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖表悬,靈堂內(nèi)的尸體忽然破棺而出弥锄,到底是詐尸還是另有隱情,我是刑警寧澤蟆沫,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布籽暇,位于F島的核電站,受9級(jí)特大地震影響饭庞,放射性物質(zhì)發(fā)生泄漏戒悠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一舟山、第九天 我趴在偏房一處隱蔽的房頂上張望绸狐。 院中可真熱鬧,春花似錦累盗、人聲如沸寒矿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)符相。三九已至,卻和暖如春蠢琳,著一層夾襖步出監(jiān)牢的瞬間啊终,已是汗流浹背镜豹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓝牲,地道東北人趟脂。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像搞旭,于是被迫代替她去往敵國(guó)和親散怖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容