科研作图R语言R语言知识干货

R语言_ggplot2

2017-04-02  本文已影响1181人  1998962ab991

关于ggplot2包的应用。

数据结构、绘图对象、图层、标度变换、分面、坐标系、主题;

数据结构

一个图形对象,由5部分组成

  1. 数据(数据框格式) + 图形属性映射
    • 封箱:将数据分为子集的形式;默认为bins=30
  2. 一个/多个图层;图层:一个图层必须由4部分组成
    • 一种位置调整方式
    • 数据和图形属性映射
    • 一种统计变换
    • 一种几何对象
  3. 标度;每个图形属性映射都对应一个标度
  4. 一个坐标系统
  5. 分面设定

1. 绘图对象(数据+图形属性[aes])

# 数据+图形属性
ggplot(data, aes())

可以使用变量的函数值作为参数;eg: aes(sqtr(age))

aes - aesthetics

数据

如果你的数据改变了,绘图不会改变

可以被存储save()到磁盘上,并可被直接加载运行load()

p <- ggplot(mtcars aes(mpg,wt)) + geom_point() 
# 绘制散点图
mt <- transform(mtcars, mmpg=mpg^2)
# 设置新的数据集

p %+% mtcars
## 对新的数据集绘制相同的图形

图形属性-aes

属性 描述
shape 点的形状
fill 填充区域
color 区域的边界;点、线的颜色
linetype 线条类型
size 点的大小;线的宽度
alpha 颜色透明度;
label 标签;rowname(data)
group 分组

alpha

若想采用同一色度,则加上alpha=var

分组

group=factor(var) / fill=factor(col)

p <- ggplot(Oxboys, aes(age, height, gruop=Subject)) + geom_line()
p + geom_smooth(aes(gruop=1), method="lm", size=2, se=F)
# Occasion为离散型变量,默认分组变量即Occasion
boysbox <- ggplot(Oxboys, aes(Occasion, height)) + geom_boxplot()  

# 在原基础上添加个体轨迹(此处分组变量因为每个个体Subject)
boysbox + geom_line(aes(group=Subject), colour="darkblue") 

--若直接在ggplot()函数中添加分组变量,则表示对之后所有图层都适用

2. 图层(几何对象)

设定与映射

设定:p + geom_point(colour="darkblue") (其中p <- ggplot(mtcars, aes(x=mpg, y=wt)))

行为:图层里colour参数设定了点的颜色

映射:p + geom_point(aes(colour="darkblue"))

行为:先创建一个只含有"darkblue"的变量,然后将colour映射到这个新变量;因为这个变量是离散型的,默认的颜色标度用色轮上等间距的颜色,并且此处只有一个值,因此这个颜色就是桃红色

设定

【设定】图形属性为一个单一值 - 几何对象中的参数

属性 描述
shape 点的形状
fill 填充区域
color 区域的边界;点、线的颜色
linetype 线条类型
size 点的大小;线的宽度
alpha 颜色透明度;[0~1]
position 位置
binwidth 直方图宽度geom_histogram [0,1]
width 箱线图宽度geom_boxplot [0,1]
side 地毯图geom_rug的位置;
notch=T/F 方块图是否为缺口

position

对图层中元素的位置进行微调;

常用于离散型数据;[连续型数据很少出现完全重叠的现象]

映射

【映射】到一个变量:修改绘图对象的图形属性

geom_point(aes(colour=cly)  -> aes(mpg, wt, colour=cyl)))  # 添加

geom_point(aes(y=disp) -> aes(mpg, disp)  # 修改
           
geom_point(aes(y-NULL)) -> aes(mpg)  # 删除

3. 图层(统计变换+位置调整)

统计变化 - stat_xx



- 可在统计变换中**修改集合对象**;

​```R
d <- ggplot(diamonds,aes(carat,price))
d +stat_density2d(geom="point", aes(size=..density..), contour=F)

4. 标度变换(scale)

位置标度 - 坐标轴

坐标轴标签名称

+ xlab("xx") / ylab("xx")

+ labs(x="",y="",title="",subtitle="")

坐标轴刻度范围

+ xlim() /ylim()

xlim(n,n) / ylim(n,n) / ylim(0, max(data$var))  # 连续型
xlim("a","b","c")  # 离散型
xlim(as.Date(c("2008-05-01","2008-08-01"))  # 日期型


控制标签出现的个数和顺序
+ scale_x_ (limits=()) 
# + scale_x_discrete(limits=c("trt2", "ctrl"))  # 本应该有3个离散变量

对条形图、直方图不可用xlim(),因为会删除其不再范围内的变量;应改用coord_cartesion(xlim=c(,) )

刻度值的分段与显示

+ scale_x_continuous()  # 连续型
+ scale_x_discrete()  # 离散型


limits=c( )  # 固定标度的定义域;连续型-数值型,离散型-字符; limits影响显示在图形上的元素
## 要显示的范围; #控制标签的个数和顺序

breaks=c( )  # 指定坐标轴上应显示哪些刻度线的值或一个连续型标度在一个图例中将被如何分段。
## breaks影响显示在坐标轴和图例上的元素
## scale_x_continuous(breaks=c(0.1,0.2))  # 设置显示的x轴标签刻度值

labels=c()  # 指定了应在断点处显示的标签
## 若设置了labels,则必须同时指定breaks

----------------------------------------------------------------------------------
改变变量的显示顺序
scale_x_discrete/continuous

自定义
# +scale_x_discrete(limits=c("trt1","ctrl","trt2"))
只显示x1和x2两项
## p <- ggplot(diamonds,aes(x=carat,y=price))
## p + geom_point(colour = "green") + scale_x/y_discrete(limits=c('x1','x2'))

转置
转置 -离散变量
+ scale_x_discrete(limits=rev(levels(PlantGrowth$group)))  
## 必须跟在ggplot()之后,不可用 last_plot() + scale_x_  否则会报错;但可用 p + scale_x_discrete
转置 -连续变量
+ scale_y_reverse()


----------------------------------------------------------------------------------
变更显示的刻度值
breaks=c()
#  + scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6, 8))


----------------------------------------------------------------------------------
设置x/y轴显示的相对比例
# 1:1
+ scale_y_continuous(breaks=seq(0, 420, 30)) 
+ scale_x_continuous(breaks=seq(0, 420, 30))

# 1:2
+ scale_y_continuous(breaks=seq(0, 420, 30))  
+ scale_x_continuous(breaks=seq(0, 420, 15))
+ scale_x_continous(trans="")
+ scale_x_continuous(trans="log(10)")

日期与时间
as.Date()
+ scale_x_data( )

----------------------------------------------------------------------------------
主刻度线
breaks=,可为数值型向量
date_breaks="",只能是字符串向量,"2 weeks" / "10 years"

次刻度线
minor_breaks=,
date_minor_breaks="",只能是字符串向量,"1 day"

----------------------------------------------------------------------------------
格式输出
lables=date_format(" ")

颜色标度

scale_color_  / scale_fill_


离散型颜色梯度
+ scale_color/fill_hue()  # 默认
+ scale_color/fill_brewer(palette="")
## 对象为点 -  "Set1" / "Dark2"
## 对象为面积 - "Set2" / "Pastel1" / "Pastel2" / "Accent"
## 得到所有颜色的展示 library(RColorBrewer)  display.brewer.all()
手动离散型颜色标度
+ scale_color/fill_manual(values=c("xx","xx"))  手动设定颜色的值


----------------------------------------------------------------------------------
连续型颜色梯度(渐变色)
scale_color/fill_gradient(low="", high="")  # 双色 low,high,分别控制梯度两端的颜色
scale_color/fill_gradient2(low="",high="", midpoint=)  # 三色 low,high,midpoint(默认为0)
scale_color/fill_gradientn() , color=xx  # 自定义n色 一个颜色向量

图例标度 - guides

图例-guide_legend()

+ guides(color = guide_legend(reverse=TRUE))  # 内部顺序 
# 条形图时,且用fill来分组时
# 当分组用alpha时,guide(alpha=guide_legend(reverse=T))


----------------------------------------------------------------------------------
图例-标题
用fill来填充颜色,那么我们去掉图例就需要用fill, 去掉标题
third <- ggplot(mpg, aes(cyl, hwy, fill = factor(cyl))) + geom_boxplot()
third + guides(fill = guide_legend(title = "how"))
third + guides(fill = guide_legend(title.position = "top"))


----------------------------------------------------------------------------------
图例-标签
third + guides(fill = guide_legend(label = TRUE)) # 标签与否
third + guides(fill = guide_legend(label.position = "top")) # 标签位置
third + guides(fill = guide_legend(label.theme = element_text(size = 15, face = "italic", colour = "red", angle = 30)))


----------------------------------------------------------------------------------
图例-图表
third + guides(fill = guide_legend(keywidth = 5)) # 图表宽度
third + guides(fill = guide_legend(direction = "horizontal"))  /  "vertical"
third + guides(fill = guide_legend(nrow = 2))  # 图表的列数
third + guides(fill = guide_legend(reverse = TRUE)) # 反向显示图例

5. 分面(facet)

6. 坐标系(coord)

范围设置
coord_cartesian(xlim=c(n,n))
## 与 +xlim() & scale_x_continuous(limits=c()) 区别:
## coord - 使用的仍是所有数据,只是展示的仅该部分数据;如同用放大镜看数据
## xlim() & scale_x_ - 是将超出此范围的数据都删除,仅对在该范围内的数据做图


x/y轴翻转 
+ coord_flip()
# 或者 直接在图形属性aes()中将变量先后顺序调换


坐标轴变换 - 在统计量计算之后,会改变几何形状
+ coord_trans(x=..., y=...)


x/y轴标度比例
+ coord_equal()  # 默认为1:1
+ coord_equla(ratio=1.5)  # ratio=y/x的值
极坐标
polar # 绘制饼图/雷达图

地图投影

7. 主题(theme)

主题与设置

整体风格变动 - 四种种内置主题

+ theme_gray()  # 灰色背景,白色网格线
+ theme_bw()  # 白色背景,灰色网格线
+ theme_classic() # 白色背景,无网格线
+ theme_minimal()  # 无坐标线

--

设置 -
theme_set()  # 返回先前的主题
theme_get()  # 获得当前主题设置

全局设置
theme_set(theme_gray())

局部设置 
直接在ggplot()之后 + theme_gray() / bw()

----------------------------------------------------------------------------------
为之后的图形设置主题 theme_update()
theme_update(plot.title=element_text(hjust=0.5, face="bold"))  # 标题水平居中
或者赋值为theme1 <- theme_update() ,之后是 theme_set(theme1)

--

永久性存储主题
theme1 <- theme_gray() + theme(plot.title=element_text(hjust=0.5, face="bold"))
theme2 <- theme_bw() + theme(plot.title=element_text(hjust=0.5, face="bold"))
theme3 <- theme_classic() +theme(plot.title=element_text(hjust=0.5, face="bold"))
ggplot() + theme_bw

主题元素+元素函数

坐标系 - axis. 
axis.line  # 直线和坐标轴
axis.text.x  # x/y轴标签
axis.ticks  # 轴须标签
axis.title.x  # x/y轴标题

--

图例 - legend.
legend.bakgroud  # 图例背景
legend.key  # 图例符号
legend.text  # 图例标签
legend.title  # 图例标题

# 独立运作
+ theme(legend.position="none" / "left" /"right"/"bottom"/"top"/=c(n,n) )  # n为[0,1]

--

面板 - panel.
panel.backgound  # 面板背景
panel.border  # 面板边界
panel.grid.major  # 主网格线
panel.grid.minor  # 次网格线

--

整个图形 - plot.
plot.background  # 整个图形背景
plot.title  # 图形标题

--

其他 - strip.
strip.backgroud  # 分面标签背景
strip.text.x  # 水平/竖直条状文本

属性参考

几何对象 - 点 - geom_xx

plot
# 点  # + stat_smooth() # 添加平滑曲线
  
dotplot
# 点直方图(用点来表示观测值的个数)

jitter
# 给点添加扰动(减轻重叠问题)

几何对象 - 线

abline 
# 线(由斜率和截距决定)

hline
# 水平线 ; yintercept=n / n1:n2
vline
# 竖直线 ; xintercept=

----------------------------------------------------------------
line
# 按照x坐标的大小顺序依次连接各个观测值
path
# 路径图(按数据的原始顺序连接各个观测值)
step
# 以阶梯形式联接各个观测值

----------------------------------------------------------------
quantile
# 添加分位数回归线

segment
# 添加线段/箭头 
## geom_segment(aes(x=, xend=, y=, yend= ))

smooth
# 添加光滑的条件均值线
## method=smooth(默认) lm-线性; loess-非参数光滑曲线; gam-广义相加模型; glm-广义线性; rlm-健壮线性; 
## formula= y~x (默认) y~log(x);  y~poly(x,n) -n次多项式拟合;  y~ns(x,n) -具有n个自由度的样条拟合
## se=T/F  绘制置信区间;默认为T
## level=num 默认为95%
## fullrange=F/T ,拟合覆盖全图(T),仅覆盖数据(F) 默认为F


density
# 光滑密度曲线图
density2d
# 二维密度等高线图

----------------------------------------------------------------
linerang
# 一条代表一个区间的竖直线
pointrang
# 用一条中间带点的竖直线代表一个区间

几何对象 - 面

bar - 条形图

# 条形图(以x轴为底的矩形)

图形/位置调整
# geom_bar(position="dodge") -分组条形图; (position="fill") -百分比条形图;

水平条形图
# + coord_flip()

堆砌分组条形图(两个类别型变量)
# ggplot(hr_good,aes(left,number_project,fill=factor(number_project))) + geom_bar(stat="sum") 

调整距离宽度与间距; 
# width=0.5 -也可以看做x坐标轴之间的分割大小; position=position_dodge(0.7)


----------------------------------------------------------------------
项目排序 -reorder
# 按z值的大小,重新排列条形图的顺序,只需将aes()中x的属性用reorder()函数更改即可; 
## ggplot(df, aes(x = reorder(x, z), y = z, fill = y)) +geom_bar(stat = 'identity') + xlab('x')

项目排序 -降序排序
# 1. arrange(data, M)  升序排列
# 2. data$M <- factor(data$M, order=T, levels=data$M))  # 因子化 / data$M <- with(data, factor(var, order=T, levels=var))

项目排序 -如果x是因子,我们可以对其用带参数limits=rev(levels(…))的函数scale_x_discrete()进行修正。
##  + coord_flip() + scale_x_discrete(limits=rev(levels(PlantGrowth$group)))
项目排序 -直接修正
# 直接用scale_x_discrete(limits=c()) 来修正顺序

-----------------------------------------------------------------------
添加标签
# geom_text(aes(label=var))
## hjust/vjust=-0.2 -表示显示在外面;  hjust/vjust=1.5 -表示显示在里面

添加标签 -对于分组条形图
# geom_text(position = position_dodge(0.9))
添加标签 -对于堆积条形图
# geom_text(position = position_stack())


histogram - 直方图

调整组距:
# 1)binwidth=n  # 组距宽度;也可以看做x坐标轴之间的分割大小
# 2)bins=n  # 组的数量
# 3)breaks=c(n, n, n)  # 具体的x轴坐标尺度来划分

调整分组直方图两者之间重叠程度
# position=position_dodge(0.5)

密度直方图
# histogram(aes(y=..density))
在密度直方图基础上,添加核密度曲线
## stat_density(geom="line")

其他面图

boxplot
# 箱线图

area
# 面积图

freqplot
# 频率多边形图

几何对象 - 非常规图形

errorbar
# 误差棒
errorbarh
# 水平误差棒

rug
# 边际地毯图(轴须图)

--

blank
# 空白

contor
# 等高线图

crossbar
# 带水平中心线的盒子图

hex
# 六边形二维热点图

map
# 基准地图里多边形

ploygon
# 多边型(相当于一个有填充的路径)

raster
# 高效的矩形瓦片图

rect
# 二维矩阵图

ribbon
# 色带图(连续的x值所对应y的范围)

violin
# 小提琴图

tile
# 瓦片图

text - 文本注释

linetype

符号 描述
1 实线
2 虚线
3
4 破折号
5 长破折号
6 双破折号

position

符号 描述 示例
stack 堆叠 堆砌条形图
fill 堆叠并高度标准化为1 百分比堆砌条形图
dodge 并列 分组条形图
jitter 给点添加扰动,避免重叠
identity 不做任何调整

identity ,不适合条形图,因为后面画的条形会挡住先画的

size

地毯图geom_rug的位置;

符号 描述
b 底部
l 左侧
r 右侧
t 顶部
bl 左下
"tl" 、 "tr"、"br" 左上、右上、右下

统计变换

作图问题

图形基本处理

summary()  # 查看结构

ggsave()  # 保存到磁盘
--ggsave("name.png", [plot=plot_name] width=, height=)  
# plot_name为创建图像的名称;若忽略,则对最佳的图像保存

save()  # 缓存保存到磁盘; 可保存一个图形对象的完整副本,并可用load()来重现该函数

print()  # 呈现
上一篇下一篇

猜你喜欢

热点阅读