ggplot2高效实用指南 (可视化脚本、工具、套路、配色)

作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源

编者按:数据可视化是解析、理解和展示数据不可缺少的一部分。炫或不炫看个人喜好和功底,能否达意是最基本的要求---最合适的图示和配色表达最直观的含义。长文多图预警,这是关于ggplot2使用的极详细教程(190+图),是入门和晋级参考的不二手册。

前面部分是关于qplot的使用,后面是ggplot2图层的使用。原文使用R自带数据集,后面有生信宝典出品的针对生信常见作图的ggplot2使用教程。为完善之际,本文整理了关于可视化套路 (什么图适合做什么), 图形配色 (美观不突兀)和多种在线、本地、编程和界面类绘图工具和脚本供集中学习和收藏使用。

简介

本文内容基本是来源于STHDA,这是一份十分详细的ggplot2使用指南,因此我将其翻译成中文,一是有助于我自己学习理解,另外其他R语言爱好者或者可视化爱好者可以用来学习。翻译过程肯定不能十全十美,各位读者有建议或改进的话,十分欢迎发Email([email protected])给我。

ggplot2是由Hadley Wickham创建的一个十分强大的可视化R包。按照ggplot2的绘图理念,Plot(图)= data(数据集)+ Aesthetics(美学映射)+ Geometry(几何对象):

  • data: 数据集,主要是data frame;

  • Aesthetics: 美学映射,比如将变量映射给x,y坐标轴,或者映射给颜颜色、大小、形状等图形属性;

  • Geometry: 几何对象,比如柱形图、直方图、散点图、线图、密度图等。

ggplot2中有两个主要绘图函数:qplot()以及ggplot()。

  • qplot(): 顾名思义,快速绘图;

  • ggplot():此函数才是ggplot2的精髓,远比qplot()强大,可以一步步绘制十分复杂的图形。

ggplot2绘制出来的ggplot图可以作为一个变量,然后由print()显示出来。

图形类型

根据数据集,ggplot2提供不同的方法绘制图形,主要是为下面几类数据类型提供绘图方法:

  • 一个变量x: 连续或离散

  • 两个变量x&y:连续和(或)离散

  • 连续双变量分布x&y: 都是连续

  • 误差棒

  • 地图

  • 三变量

安装及加载

安装ggplot2提供三种方式:

#直接安装tidyverse,一劳永逸(推荐,数据分析大礼包)
install.packages("tidyverse")
#直接安装ggplot2
install.packages("ggplot2")
#从Github上安装最新的版本,先安装devtools(如果没安装的话)
devtools::install_github("tidyverse/ggplot2")

加载

library(ggplot2)

数据准备

数据集应该数据框data.frame

本文将使用数据集mtcars

#load the data set
data(mtcars)
df <- mtcars[, c("mpg","cyl","wt")]
#将cyl转为因子型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()类似于R基本绘图函数plot(),可以快速绘制常见的几种图形:散点图、箱线图、小提琴图、直方图以及密度曲线图。其绘图格式为:

qplot(x, y=NULL, data, geom="auto")

其中:

  • x,y: 根据需要绘制的图形使用;

  • data:数据集;

  • geom:几何图形,变量x,y同时指定的话默认为散点图,只指定x的话默认为直方图。

散点图

qplot(x=mpg, y=wt, data=df, geom = "point")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第1张图片
也可以添加平滑曲线

qplot(x=mpg, y=wt, data = df, geom = c("point", "smooth"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第2张图片
还有其他参数可以修改,比如点的形状、大小、颜色等

#将变量cyl映射给颜色和形状
qplot(x=mpg, y=wt, data = df, colour=cyl, shape=cyl)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第3张图片

箱线图、小提琴图、点图

#构造数据集
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)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第4张图片
小提琴图

qplot(sex, weight, data = wdata, geom = "violin")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第5张图片
点图

qplot(sex, weight, data = wdata, geom = "dotplot", stackdir="center", binaxis="y", dotsize=0.5, color=sex)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第6张图片

直方图、密度图

直方图

qplot(weight, data = wdata, geom = "histogram", fill=sex)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第7张图片
密度图

qplot(weight, data = wdata, geom = "density", color=sex, linetype=sex)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第8张图片

ggplot()

上文中的qplot()绘制散点图:

qplot(x=mpg, y=wt, data=df, geom = "point")

在ggplot()中完全可以如下实现:

ggplot(data=df, aes(x=mpg, y=wt))+
  geom_point()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第9张图片
改变点形状、大小、颜色等属性

ggplot(data=df, aes(x=mpg, y=wt))+geom_point(color="blue", size=2, shape=23)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第10张图片
绘图过程中常常要用到转换(transformation),这时添加图层的另一个方法是用stat_*()函数。
下例中的geom_density()与stat_density()是等价的

ggplot(wdata, aes(x=weight))+geom_density()

等价于

ggplot(wdata, aes(x=weight))+stat_density()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第11张图片

对于每一种几何图形。ggplot2 基本都提供了 geom()和 stat()

一个变量:连续型

使用数据集wdata,先计算出不同性别的体重平均值

library(plyr)
mu <- ddply(wdata, "sex", summarise, grp.mean=mean(weight))

先绘制一个图层a,后面逐步添加图层

a <- ggplot(wdata, aes(x=weight))

可能添加的图层有:

  • 对于一个连续变量:

    • 面积图geom_area()

    • 密度图geom_density()

    • 点图geom_dotplot()

    • 频率多边图geom_freqpoly()

    • 直方图geom_histogram()

    • 经验累积密度图stat_ecdf()

    • QQ图stat_qq()

  • 对于一个离散变量:

    • 条形图geom_bar()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第12张图片

面积图

a+geom_area(stat = "bin")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第13张图片
改变颜色

a+geom_area(aes(fill=sex), stat = "bin", alpha=0.6)+
  theme_classic()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第14张图片

注意:y轴默认为变量weight的数量即count,如果y轴要显示密度,可用以下代码:

a+geom_area(aes(y=..density..), stat = "bin")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第15张图片
可以通过修改不同属性如透明度、填充颜色、大小、线型等自定义图形:

密度图

使用以下函数:

  • geom_density():绘制密度图

  • geom_vline():添加竖直线

  • scale_color_manual():手动修改颜色

a+geom_density()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第16张图片
根据sex修改颜色,将sex映射给line颜色

a+geom_density(aes(color=sex))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第17张图片
修改填充颜色以及透明度

a+geom_density(aes(fill=sex), alpha=0.4)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第18张图片
添加均值线以及手动修改颜色

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第19张图片

点图

a+geom_dotplot()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第20张图片
将sex映射给颜色

a+geom_dotplot(aes(fill=sex))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第21张图片
手动修改颜色

a+geom_dotplot(aes(fill=sex))+
  scale_fill_manual(values=c("#999999", "#E69F00"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第22张图片

频率多边图

a+geom_freqpoly()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第23张图片
y轴显示为密度

a+geom_freqpoly(aes(y=..density..))+
  theme_minimal()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第24张图片
修改颜色以及线型

a+geom_freqpoly(aes(color=sex, linetype=sex))+
  theme_minimal()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第25张图片

直方图

a+geom_histogram()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第26张图片
将sex映射给线颜色

a+geom_histogram(aes(color=sex), fill="white", position = "dodge")+theme_classic()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第27张图片

经验累积密度图

a+stat_ecdf()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第28张图片

QQ图

ggplot(data = mtcars, aes(sample=mpg))+stat_qq()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第29张图片

一个离散变量

#加载数据集
data(mpg)
b <- ggplot(mpg, aes(x=fl))
b+geom_bar()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第30张图片
修改填充颜色

b+geom_bar(fill="steelblue", color="black")+theme_classic()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第31张图片

两个变量:x,y皆连续

使用数据集mtcars, 先创建一个ggplot图层

b <- ggplot(data = mtcars, aes(x=wt, y=mpg))

可能添加的图层有:

  • geom_point():散点图

  • geom_smooth():平滑线

  • geom_quantile():分位线

  • geom_rug():边际地毯线

  • geom_jitter():避免重叠

  • geom_text():添加文本注释

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第32张图片

散点图

b+geom_point()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第33张图片
将变量cyl映射给点的颜色和形状

b + geom_point(aes(color = factor(cyl), shape = factor(cyl)))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第34张图片
自定义颜色

b+geom_point(aes(color=factor(cyl), shape=factor(cyl)))+
  scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))+theme_classic()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第35张图片

平滑线

可以添加回归曲线

b+geom_smooth()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第36张图片
散点图+回归线

b+geom_point()+
  geom_smooth(method = "lm", se=FALSE)#去掉置信区间

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第37张图片
使用loess方法

b+geom_point()+
  geom_smooth(method = "loess")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第38张图片
将变量映射给颜色和形状

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)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第39张图片

分位线

ggplot(data = mpg, aes(cty, hwy))+
  geom_point()+geom_quantile()+
  theme_minimal()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第40张图片

边际地毯线

使用数据集faithful

ggplot(data = faithful, aes(x=eruptions, y=waiting))+
  geom_point()+geom_rug()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第41张图片

避免重叠

实际上geom_jitter()geom_point(position="jitter")的简称,下面使用数据集mpg

p <- ggplot(data = mpg, aes(displ, hwy))
p+geom_point()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第42张图片
增加抖动防止重叠

p+geom_jitter(width = 0.5, height = 0.5)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第43张图片
其中两个参数:

  • width:x轴方向的抖动幅度

  • height:y轴方向的抖动幅度

文本注释

参数label用来指定注释标签 (ggrepel可以避免标签重叠)

b+geom_text(aes(label=rownames(mtcars)))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第44张图片

两个变量:连续二元分布

使用数据集diamonds

head(diamonds[, c("carat", "price")])
## # A tibble: 6 x 2
##   carat price
##    
## 1  0.23   326
## 2  0.21   326
## 3  0.23   327
## 4  0.29   334
## 5  0.31   335
## 6  0.24   336

创建ggplot图层,后面再逐步添加图层

c <- ggplot(data=diamonds, aes(carat, price))

可添加的图层有:

  • geom_bin2d(): 二维封箱热图

  • geom_hex(): 六边形封箱图

  • geom_density_2d(): 二维等高线密度图

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第45张图片

二维封箱热图

geom_bin2d()将点的数量用矩形封装起来,通过颜色深浅来反映点密度

c+geom_bin2d()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第46张图片
设置bin的数量

c+geom_bin2d(bins=150)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第47张图片

六边形封箱图

geom_hex()依赖于另一个R包hexbin,所以没安装的先安装:

install.packages("hexbin")
library(hexbin)
c+geom_hex()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第48张图片
修改bin的数目

c+geom_hex(bins=10)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第49张图片

二维等高线密度图

sp <- ggplot(faithful, aes(x=eruptions, y=waiting))
sp+geom_point()+ geom_density_2d()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第50张图片

两个变量:连续函数

主要是如何通过线来连接两个变量,使用数据集economics

head(economics)
## # A tibble: 6 x 6
##         date   pce    pop psavert uempmed unemploy
##                    
## 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

先创建一个ggplot图层,后面逐步添加图层

d <- ggplot(data = economics, aes(x=date, y=unemploy))

可添加的图层有:

  • geom_area():面积图

  • geom_line():折线图

  • geom_step(): 阶梯图

面积图

d+geom_area()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第51张图片

线图

d+geom_line()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第52张图片

阶梯图

set.seed(1111)
ss <- economics[sample(1:nrow(economics), 20),]
ggplot(ss, aes(x=date, y=unemploy))+
  geom_step()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第53张图片

两个变量:x离散,y连续

使用数据集ToothGrowth,其中的变量len(Tooth length)是连续变量,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

创建图层

e <- ggplot(data = ToothGrowth, aes(x=dose, y=len))

可添加的图层有:

  • geom_boxplot(): 箱线图

  • geom_violin():小提琴图

  • geom_dotplot():点图

  • geom_jitter(): 带状图

  • geom_line(): 线图

  • geom_bar(): 条形图

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第54张图片

箱线图

e+geom_boxplot()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第55张图片
添加有缺口的箱线图

e+geom_boxplot(notch = TRUE)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第56张图片
按dose分组映射给颜色

e+geom_boxplot(aes(color=dose))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第57张图片
将dose映射给填充颜色

e+geom_boxplot(aes(fill=dose))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第58张图片
按supp进行分类并映射给填充颜色

ggplot(ToothGrowth, aes(x=dose, y=len))+ geom_boxplot(aes(fill=supp))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第59张图片

小提琴图

e+geom_violin(trim = FALSE)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第60张图片
添加中值点

e+geom_violin(trim = FALSE)+
  stat_summary(fun.data = mean_sdl, fun.args = list(mult=1), 
               geom="pointrange", color="red")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第61张图片
与箱线图结合

e+geom_violin(trim = FALSE)+
  geom_boxplot(width=0.2)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第62张图片
将dose映射给颜色进行分组

e+geom_violin(aes(color=dose), trim = FALSE)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第63张图片

点图

e+geom_dotplot(binaxis = "y", stackdir = "center")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第64张图片
添加中值点

e + geom_dotplot(binaxis = "y", stackdir = "center") + 
  stat_summary(fun.data=mean_sdl, color = "red",geom = "pointrange",fun.args=list(mult=1))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第65张图片
与箱线图结合

e + geom_boxplot() + 
  geom_dotplot(binaxis = "y", stackdir = "center")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第66张图片
添加小提琴图

e + geom_violin(trim = FALSE) +
  geom_dotplot(binaxis='y', stackdir='center')

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第67张图片
将dose映射给颜色以及填充色

e + geom_dotplot(aes(color = dose, fill = dose), 
                 binaxis = "y", stackdir = "center")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第68张图片

带状图

带状图是一种一维散点图,当样本量很小时,与箱线图相当

e + geom_jitter(position=position_jitter(0.2))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第69张图片
添加中值点

e + geom_jitter(position=position_jitter(0.2)) + 
  stat_summary(fun.data="mean_sdl",  fun.args = list(mult=1), 
               geom="pointrange", color = "red")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第70张图片
与点图结合

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第71张图片
与小提琴图结合

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第72张图片
将dose映射给颜色和形状

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第73张图片

线图

#构造数据集
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()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第74张图片
修改线型、点的形状以及颜色

ggplot(df, aes(x=dose, y=len, group=supp)) +
  geom_line(aes(linetype=supp, color = supp))+
  geom_point(aes(shape=supp, color = supp))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第75张图片

条形图

#构造数据集
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

创建图层

f <- ggplot(df, aes(x = dose, y = len))
f + geom_bar(stat = "identity")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第76张图片
修改填充色以及添加标签

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第77张图片
将dose映射给条形图颜色

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第78张图片
修改填充色

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第79张图片
将变量supp映射给填充色,从而达到分组效果

g <- ggplot(data=df2, aes(x=dose, y=len, fill=supp)) 
g + geom_bar(stat = "identity")#position默认为stack

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第80张图片
修改position为dodge

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第81张图片

两个变量:x、y皆离散

使用数据集diamonds中的两个离散变量color以及cut

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第82张图片

两个变量:绘制误差图

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

绘制误差图需要知道均值以及标准误,下面这个函数用来计算每组的均值以及标准误。

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

计算均值以及标准误

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

创建图层

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():中间为一点的误差线

具体如下:

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第83张图片

geom_crossbar()

f+geom_crossbar()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第84张图片
将dose映射给颜色

f+geom_crossbar(aes(color=dose))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第85张图片
自定义颜色

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第86张图片
修改填充色

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第87张图片
通过将supp映射给颜色实现分组,可以利用函数stat_summary()来计算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))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第88张图片

误差棒

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

将dose映射给颜色

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第89张图片
与线图结合

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第90张图片
与条形图结合,并将变量dose映射给颜色

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第91张图片

水平误差棒

#构造数据集
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

创建图层

f <- ggplot(data = df2, aes(x=len, y=dose,xmin=len-sd, xmax=len+sd))

参数xmin与xmax用来设置水平误差棒

f+geom_errorbarh()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第92张图片
通过映射实现分组

f+geom_errorbarh(aes(color=dose))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第93张图片

geom_linerange()与geom_pointrange()

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

line range

f+geom_linerange()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第94张图片
point range

f+geom_pointrange()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第95张图片

点图+误差棒

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)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第96张图片
添加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")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第97张图片
添加geom_pointrange()

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第98张图片

两个变量:地图绘制

ggplot2提供了绘制地图的函数geom_map(),依赖于包maps提供地理信息。
安装map

install.paclages("maps")

下面将绘制美国地图,数据集采用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

对数据进行整理一下,添加一列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
#数据重铸
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进行着色
ggplot(crimes, aes(map_id=state))+
  geom_map(aes(fill=Murder), map=map_data)+
  expand_limits(x=map_data$long, y=map_data$lat)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第99张图片

三个变量

使用数据集mtcars,首先绘制一个相关性图

#构造数据
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

创建图层:

g <- ggplot(cormat_melt, aes(x=Var1, y=Var2))

在此基础上可添加的图层有:

  • geom_tile(): 瓦片图

  • geom_raster(): 光栅图,瓦片图的一种,只不过所有的tiles都是一样的大小

现在使用使用geom_tile()绘制相关性矩阵图,我们这里这绘制下三角矩阵图,首先要整理数据:

#获得相关矩阵的下三角
get_lower_tri <- function(cormat){
  cormat[upper.tri(cormat)] <- NA
  return(cormat)
}
#获得相关矩阵的上三角
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

绘制相关矩阵图

#数据重铸
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()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第100张图片

上图中蓝色代表互相关,红色代表正相关,至于coord_fixed()保证x,y轴比例为1

可以看出上图顺序有点乱,我们可以对相关矩阵进行排序

#构造函数
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)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第101张图片

图元:多边形、路径、带状、射线(线段)、矩形等

本节主要讲述的是添加图形元件,将用到一下函数:

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第102张图片

添加路径、带状、矩形

创建图层

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

添加路径

h+geom_path()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第103张图片
添加带状

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第104张图片
添加矩形

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第105张图片

添加线段

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第106张图片
添加箭头

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第107张图片

添加曲线

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第108张图片

图形参数:主标题、坐标轴标签、图例标题

创建图层

ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p <- ggplot(ToothGrowth, aes(x=dose, y=len))+geom_boxplot()

修改标题以及标签的函数有:

  • ggtitle(“New main title”): 添加主标题

  • xlab(“New X axis label”): 修改x轴标签

  • ylab(“New Y axis label”): 修改y轴标签

  • labs(title = “New main title”, x = “New X axis label”, y = “New Y axis label”): 可同时添加主标题以及坐标轴标签,另外,图例标题也可以用此函数修改

修改主标题以及标签

(p <- p+labs(title="Plot of length\nby dose", x="Dose (mg)", y="teeth length"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第109张图片

修改标签属性:颜色、字体、大小等

使用theme()修改,element_text()可以具体修改图形参数,element_blank()隐藏标签

#修改标签
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")
)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第110张图片

#隐藏标签
p+theme(
  plot.title = element_blank(),
  axis.title.x = element_blank(),
  axis.title.y = element_blank()
)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第111张图片

修改图例标题

p <- ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose))+
  geom_boxplot()
p

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第112张图片

#修改图例标题
p+labs(fill="Dose (mg)")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第113张图片

图例位置以及外观

修改图例位置以及外观

#图例位置在最上面,有五个选项:"left","top", "right", "bottom", "none"
p+theme(legend.position = "top")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第114张图片
移除图例

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第115张图片
修改图例标题以及标签外观

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第116张图片
修改图例背景

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第117张图片

利用scale()函数自定义图例

主要两个函数:

  • scale_x_discrete():修改图例标签顺序

  • scale_fill_discrete(): 修改图例标题以及标签

#修改顺序
p+scale_x_discrete(limits=c("2", "0.5", "1"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第118张图片

#修改标题以及标签
p+scale_fill_discrete(name="Dose", label=c("A","B","C"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第119张图片

自动/手动修改颜色

mtcars$cyl <- as.factor(mtcars$cyl)

创建图层

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第120张图片

sp+geom_point(color="darkblue")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第121张图片

通过映射分组修改颜色

(bp <- bp+geom_boxplot(aes(fill=dose)))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第122张图片

(sp <- sp+geom_point(aes(color=cyl)))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第123张图片

手动修改颜色

主要两个函数:

  • scale_fill_manual(): 填充色

  • scale_color_manual():轮廓色,如点线

# Box plot
bp + scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第124张图片

# Scatter plot
sp + scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第125张图片

使用RColorBrewer调色板

  • scale_fill_brewer(): 填充色

  • scale_color_brewer():轮廓色,如点线

# Box plot
bp + scale_fill_brewer(palette="Dark2")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第126张图片

# Scatter plot
sp + scale_color_brewer(palette="Dark2")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第127张图片
RColorBrewer包提供以下调色板

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第128张图片
还专门有一个灰度调色板:

# Box plot
bp + scale_fill_grey() + theme_classic()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第129张图片

# Scatter plot
sp + scale_color_grey() + theme_classic()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第130张图片

梯度或连续颜色

有时我们会将某个连续变量映射给颜色,这时修改这种梯度或连续型颜色就可以使用以下函数:

  • scale_color_gradient(), scale_fill_gradient():两种颜色的连续梯度

  • 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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第131张图片

# Change the low and high colors
# Sequential color scheme
sp2+scale_color_gradient(low="blue", high="red")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第132张图片

# Diverging color scheme
mid<-mean(mtcars$qsec)
sp2+scale_color_gradient2(midpoint=mid, low="blue", mid="white",
                          high="red", space = "Lab" )

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第133张图片

点颜色、大小、形状

R提供的点形状是由数字表示的,具体如下:

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第134张图片

# Basic scatter plot
ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_point(shape = 18, color = "steelblue", size = 4)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第135张图片

# Change point shapes and colors by groups
ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_point(aes(shape = cyl, color = cyl))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第136张图片
可通过以下方法对点的颜色、大小、形状进行修改:

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第137张图片

文本注释

对图形进行文本注释有以下方法:

  • geom_text(): 文本注释

  • geom_label(): 文本注释,类似于geom_text(),只是多了个背景框

  • annotate(): 文本注释

  • annotation_custom(): 分面时可以在所有的面板进行文本注释

set.seed(1234)
df <- mtcars[sample(1:nrow(mtcars), 10), ]
df$cyl <- as.factor(df$cyl)

散点图注释

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第138张图片

# Add text at a particular coordinate
sp + geom_text(x = 3, y = 30, label = "Scatter plot",
              color="red")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第139张图片

# geom_label()进行注释
sp + geom_label(aes(label=rownames(df)))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第140张图片

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第141张图片

线型

R里的线型有七种:“blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, “twodash”,对应数字0,1,2,3,4,5,6.

具体如下:

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第142张图片

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第143张图片
同点一样,线也可以类似修改:

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第144张图片

主题与背景颜色

# Convert the column dose from numeric to factor variable
ToothGrowth$dose <- as.factor(ToothGrowth$dose)

创建箱线图

p <- ggplot(ToothGrowth, aes(x=dose, y=len))+
  geom_boxplot()

修改主题
ggplot2提供了好几种主题,另外有一个扩展包ggthemes专门提供了一主题,可以安装利用。

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)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第145张图片

p+theme_bw()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第146张图片

  • theme_linedraw : black lines around the plot

  • theme_light : light gray lines and axis (more attention towards the data)

p + theme_linedraw()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第147张图片

p + theme_light()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第148张图片

  • theme_minimal: no background annotations

  • theme_classic : theme with axis lines and no grid lines

p + theme_minimal()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第149张图片

p + theme_classic()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第150张图片
ggthemes提供的主题

p+ggthemes::theme_economist()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第151张图片

坐标轴:最大最小值

p <- ggplot(cars, aes(x=speed, y=dist))+geom_point()

修改坐标轴范围有以下几种方式:
1、不删除数据

  • p+coord_cartesian(xlim=c(5, 20), ylim=c(0, 50)):笛卡尔坐标系,这是设定修改不会删除数据

2、会删除部分数据:不在此范围内的数据都会被删除,因此在此基础上添加图层时数据是不完整的

  • p+xlim(5, 20)+ylim(0, 50)

  • p+scale_x_continuous(limits=c(5, 20))+scale_y_continuous(limits=c(0, 50))

3、扩展图形范围:expand()函数,扩大范围

  • p+expand_limits(x=0, y=0):设置截距为0,即过原点

  • p+expand_limits(x=c(5, 50), y=c(0, 150)):扩大坐标轴范围,这样图形显示就小了

下面通过图形演示

p

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第152张图片

#通过coord_cartesian()函数修改坐标轴范围
p+coord_cartesian(xlim =c (5, 20), ylim = c(0, 50))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第153张图片

#通过xlim()和ylim()函数修改
p+xlim(5, 20)+ylim(0, 50)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第154张图片

#expand limits
p+expand_limits(x=c(5, 50), y=c(0, 150))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第155张图片

坐标变换

p <- ggplot(cars, aes(x=speed, y=dist))+geom_point()

坐标变换有以下几种:

  • p+scale_x_log10(),p+scale_y_log10(): 绘图时对x,y取10的对数

  • p+scale_x_sqrt(),p+scale_x_sqrt(): 开根号

  • p+scale_x_reverse(),p+scale_x_reverse():坐标轴反向

  • p+coord_trans(x =“log10”, y=“log10”): 同上,可以对坐标轴取对数、根号等

  • p+scale_x_continuous(trans=”log2”),p+scale_x_continuous(trans=”log2”): 同上,取对数的另外一种方法

下面实例演示:

p

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第156张图片

p+scale_x_continuous(trans = "log2")+
  scale_y_continuous(trans = "log2")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第157张图片

#修改坐标刻度标签
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)))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第158张图片

#坐标轴反向
p+scale_y_reverse()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第159张图片

坐标刻度:刻度线、标签、顺序等

更改坐标轴刻度线标签等函数:

  • element_text(face, color, size, angle): 修改文本风格

  • element_blank(): 隐藏文本

(p <- ggplot(ToothGrowth, aes(x=dose, y=len))+geom_boxplot())

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第160张图片
修改刻度标签等

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第161张图片
移除刻度标签等

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第162张图片
当然可以自定义坐标轴了

  • 离散非连续坐标轴

    • scale_x_discrete(name, breaks, labels, limits)

    • scale_y_discrete(name, breaks, labels, limits)

  • 连续型坐标轴

    • scale_x_conyinuous(name, breaks, labels, limits)

    • scale_y_continuous(name, breaks, labels, limits)

详细情况如下:

  • name: x,y轴的标题

  • breaks: 刻度,分成几段

  • labels:坐标轴刻度线标签

  • limits: 坐标轴范围

其中scale_xx()函数可以修改坐标轴的如下参数:

  • 坐标轴标题

  • 坐标轴范围

  • 刻度标签位置

  • 手动设置刻度标签

具体演示:

  • 离散坐标轴

#修改标签以及顺序
p+scale_x_discrete(name="Dose (mg)", limits=c("2", "1", "0.5"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第163张图片

#修改刻度标签
p+scale_x_discrete(breaks=c("0.5", "1", "2"),labels=c("Dose 0.5", "Dose 1", "Dose 2"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第164张图片

#修改要显示的项
p+scale_x_discrete(limits=c("0.5", "2"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第165张图片

  • 连续型坐标轴

    #散点图
    (sp <- ggplot(cars, aes(x=speed, y=dist))+geom_point())

    ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第166张图片
    修改坐标轴标签以及范围

    (sp <- sp+scale_x_continuous(name = "Speed of cars", limits = c(0, 30))+
    scale_y_continuous(name = "Stopping distance", limits = c(0, 150)))

    ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第167张图片
    更改y轴刻度,间隔50

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

    ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第168张图片
    修改y轴标签为百分数

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

    ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第169张图片

    添加直线:水平线、竖直线、回归线

    ggplot2提供以下方法为图形添加直线:

  • geom_hline(yintercept, linetype, color, size): 添加水平线

  • geom_vline(xintercept, linetype, color, size):添加竖直线

  • geom_abline(intercept, slope, linetype, color, size):添加回归线

  • geom_segment():添加线段

实例演示:

sp <- ggplot(data=mtcars, aes(x=wt, y=mpg))+ geom_point()

添加直线:

#在y=20处添加一水平线,并设置颜色等
sp+geom_hline(yintercept = 20, linetype="dashed", color='red')

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第170张图片

#在x=3处添加一竖直线,并设置颜色等
sp+geom_vline(xintercept = 3, color="blue", size=1.5)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第171张图片

#添加回归线
sp+geom_abline(intercept = 37, slope = -5, color="blue")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第172张图片

#添加水平线段
sp+geom_segment(aes(x=2, y=15, xend=3, yend=15), color="red")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第173张图片

图形旋转:旋转、反向

主要是下面两个函数:

  • coord_flip():创建水平方向图

  • scale_x_reverse(),scale_y_reverse():坐标轴反向

set.seed(1234)
(hp <- qplot(x=rnorm(200), geom = "histogram"))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第174张图片

#水平柱形图
hp+coord_flip()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第175张图片

#y轴反向
hp+scale_y_reverse()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第176张图片

分面

分面就是根据一个或多个变量将图形分为几个图形以便于可视化,主要有两个方法实现:

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第177张图片
针对上面图形进行分面:

  • p+facet_grid(supp~.): 按变量supp进行竖直方向分面

  • p+facet_grid(.~supp): 按变量supp进行水平方向分面

  • p+facet_wrap(dose~supp):按双变量supp和dose进行水平竖直方向分面

  • p+facet_wrap(~fl): 将分成的面板边靠边置于一个矩形框内

1、按一个离散变量进行分面:

#竖直方向进行分面
p+facet_grid(supp~.)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第178张图片

#水平方向分面
p+facet_grid(.~supp)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第179张图片
2、按两个离散变量进行分面

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第180张图片

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第181张图片
从上面图形可以看出,每个面板的坐标轴比例都是一样的,我们可以通过设置参数scales来控制坐标轴比例

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第182张图片

位置调整

很多图形需要我们调整位置,比如直方图时,由堆叠式、百分式、分离式等,具体的要通过实例说明

p <- ggplot(mpg, aes(fl, fill=drv))
#直方图边靠边排列,参数position="dodge"
p+geom_bar(position = "dodge")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第183张图片
堆叠式position=”stack”

p+geom_bar(position = "stack")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第184张图片
position=”fill”类似玉堆叠图,只不过按百分比排列,所有柱子都被标准化成同样高度

p+geom_bar(position = "fill")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第185张图片
position=”jitter”,(主要适用于散点图)增加扰动,避免重叠,前面讲的geom_jitter()就是来源于此

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

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第186张图片
上面几个函数有两个重要的参数: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))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第187张图片

坐标系

p <- ggplot(mpg, aes(fl))+geom_bar()

ggplot2中的坐标系主要有:

  • p+coord_cartesian(xlim=NULL, ylim=NULL):笛卡尔坐标系(默认)

  • p+coord_fixed(ratio=1, clim=NULL, ylim=NULL):固定了坐标轴比例的笛卡尔坐标系。默认比例为1

  • p+coord_flip(…):旋转笛卡尔坐标系

  • p+coord_polar(theta=”x”, start=0, direction=1):极坐标系

  • p+coord_trans(x,y,limx,limy):变换笛卡尔坐标系

  • coord_map():地图坐标系

各个坐标系参数如下:
1、笛卡尔坐标系:coord_cartesian(), coord_fixed() and coord_flip()

  • xlim:x轴范围

  • ylim:y轴范围

  • ratio:y/x

  • …:其他参数

2、极坐标系:coord_polar()

  • theta:外延坐标,x或y

  • start:坐标开始的位置,默认为12点钟

  • direction:方向:顺时针(1),逆时针(-1)

3、变换坐标系:coord_trans()

  • x,y:变换的坐标轴

  • limx,limy:坐标轴范围

实例演示:

p+coord_cartesian(ylim = c(0,200))

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第188张图片

p+coord_fixed(ratio = 1/50)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第189张图片

p+coord_flip()

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第190张图片

p+coord_polar(theta = "x", direction = 1)

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第191张图片

p+coord_trans(y="sqrt")

ggplot2高效实用指南 (可视化脚本、工具、套路、配色)_第192张图片

可视化套路、配色和编辑

  • 学术图表的基本配色方法

  • 数据可视化基本套路总结

  • 史上最全的图表色彩运用原理

  • 论文图表基本规范

  • 文章用图的修改和排版 (1)

  • 文章用图的修改和排版 (2)

在线绘图和插件

  • 简单强大的在线绘图

  • 简单强大的在线绘图-升级版

  • 你和PPT高手之间,就只差一个iSlide

  • 推荐 3 个超赞的 EXCEL 插件,让你 5 分钟从小白变大神

CIRCOS系列

  • CIRCOS圈图绘制 - circos安装

  • CIRCOS圈图绘制 - 最简单绘图和解释

  • CIRCOS圈图绘制 - 染色体信息展示和调整

  • CIRCOS增加热图、点图、线图和区块属性

R统计和作图

  • 在R中赞扬下努力工作的你,奖励一份CheatShet

  • 别人的电子书,你的电子书,都在bookdown

  • R语言 - 入门环境Rstudio

  • R语言 - 热图绘制 (heatmap)

  • R语言 - 基础概念和矩阵操作

  • R语言 - 热图简化

  • R语言 - 热图美化

  • R语言 - 线图绘制

  • R语言 - 线图一步法

  • R语言 - 箱线图(小提琴图、抖动图、区域散点图)

  • R语言 - 箱线图一步法

  • R语言 - 火山图

  • R语言 - 富集分析泡泡图

  • R语言 - 散点图绘制

  • R语言 - 韦恩图

  • R语言 - 柱状图

  • R语言 - 图形设置中英字体

  • R语言 - 非参数法生存分析

  • R语言 - 绘制seq logo图

  • WGCNA分析,简单全面的最新教程

  • 一文看懂PCA主成分分析

  • 富集分析DotPlot,可以服

  • 基因共表达聚类分析和可视化

  • R中1010个热图绘制方法

  • 还在用PCA降维?快学学大牛最爱的t-SNE算法吧, 附Python/R代码

  • 一个函数抓取代谢组学权威数据库HMDB的所有表格数据

  • 文章用图的修改和排版

  • network3D: 交互式桑基图

  • network3D 交互式网络生成

  • R包ggseqlogo 绘制seq logo图

  • 生物AI插图素材获取和拼装指导

  • Seq logo 在线绘制工具——Weblogo

NGS可视化

  • 测序数据可视化 (一)

  • IGV基因组浏览器可视化高通量测序数据

  • 高通量数据分析必备|基因组浏览器使用介绍 - 1

  • 高通量数据分析必备|基因组浏览器使用介绍 - 2

  • 高通量数据分析必备|基因组浏览器使用介绍 - 3

  • 轻松绘制各种Venn图

  • ETE构建、绘制进化树

Cytoscape网络图

  • Cytoscape教程1

  • Cytoscape之操作界面介绍

  • 新出炉的Cytoscape视频教程

R统计绘图

R语言基础系列:

你知道R中的赋值符号箭头<-和等号=的区别吗?

交集intersect、并集union、找不同setdiff

1数据类型(向量、数组、矩阵、 列表和数据框)

2读写数据所需的主要函数、与外部环境交互

3数据筛选——提取对象的子集

4向量、矩阵的数学运算

5控制结构

6函数及作用域

7认识循环函数lapply和sapply

8分解数据框split和查看对象str

9模拟—随机数、抽样、线性模型

ggplot2绘图基础系列:

1初识ggplot2绘制几何对象

2图层的使用—基础、加标签、注释

3工具箱—误差线、加权数、展示数据分布

4语法基础

5通过图层构建图像

6标度、轴和图例

7定位-分面和坐标系

8主题设置、存储导出

9绘图需要的数据整理技术

高级统计绘图:

R做线性回归

绘图相关系数矩阵corrplot

相关矩阵可视化ggcorrplot

绘制交互式图形recharts

交互式可视化CanvasXpress

聚类分析factoextra

LDA分析、作图及添加置信-ggord

解决散点图样品标签重叠ggrepel

添加P值或显著性标记ggpubr

Alpha多样性稀释曲线rarefraction curve

堆叠柱状图各成分连线画法:突出组间变化

冲击图展示组间时间序列变化ggalluvial

桑基图riverplot

微生物环境因子分析ggvegan

五彩进化树与热图更配ggtree

多元回归树分析mvpart

随机森林randomForest 分类Classification 回归Regression

鼠标点点绘图系列

-SCI期刊数据可视化—折线图

猜你喜欢

10000+:菌群分析 宝宝与猫狗 梅毒狂想曲 提DNA发Nature Cell专刊 肠道指挥大脑

系列教程:微生物组入门 Biostar 微生物组  宏基因组

专业技能:学术图表 高分文章 生信宝典 不可或缺的人

一文读懂:宏基因组 寄生虫益处 进化树

必备技能:提问 搜索  Endnote

文献阅读 热心肠 SemanticScholar Geenmedical

扩增子分析:图表解读 分析流程 统计绘图

16S功能预测   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在线工具:16S预测培养基 生信绘图

科研经验:云笔记  云协作 公众号

编程模板: Shell  R Perl

生物科普:  肠道细菌 人体上的生命 生命大跃进  细胞暗战 人体奥秘  

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外5000+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。PI请明示身份,另有海内外微生物相关PI群供大佬合作交流。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍末解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

你可能感兴趣的:(ggplot2高效实用指南 (可视化脚本、工具、套路、配色))