目录
R的基础绘图系统
1. plot函数
函数 | 数据类型 | 图形 |
---|---|---|
plot() | 数值 | 散点图 |
plot() | 因子 | 条形图 |
plot() | 一组频数 | 条形图 |
plot() | 数值,数值 | 散点图 |
plot() | 因子,因子 | 脊形图 |
plot() | 二维列联表 | 马赛克图 |
plot() | 数值、因子 | 箱线图 |
plot() | 因子、数值 | 带状图 |
plot() | 数据框 | 散点图矩阵 |
以birthwt数据框为例:
attach(birthwt)
birthwt$low=factor(low)
birthwt$race=factor(race)
birthwt$smoke=factor(smoke)
birthwt$ptl=factor(ptl)
str(birthwt)
par(mfrow=c(2,2))
plot(birthwt$age)#数值
plot(birthwt$low)#因子,分类变量
plot(birthwt$age,birthwt$lwt)#数值,数值
plot(birthwt$race,birthwt$smoke) #因子,因子
plot(birthwt$age,birthwt$race) #因子,数值——带状图
plot(birthwt$race,birthwt$age) #数值,因子——箱线图
mytable=table(birthwt$low,birthwt$race)
plot(mytable)#二维列联表——马赛克图
a=table(birthwt$race)
plot(a)#一组频数——条形图
plot(birthwt)
2. 常用绘图函数
- abline 为图形添加截距为a、斜率为b的直线;
- arrows 在坐标点(x0,y0)和(x1,y1)之间绘制线段,并在端点处添加箭头;
- segments 在坐标点(x0,y0)和(x1,y1)之间绘制线段;
- box 绘制图形的边框
- legend 在坐标点(x,y)处添加图例
- lines 在坐标点(x,y)之间添加直线
- mtext 在图形区域的边距或区域的外部边距添加文本
- text 在坐标点(x,y)处添加文本
- title 为图形添加标题
- points 在坐标点(x,y)处添加点
- polygon 沿着坐标点(x,y)绘制多边形
- polypath 绘制由一个或多个连接坐标点的路径组成的多边形
- rect 绘制一个左下角在(xleft,ybottom)处、右下角在(xright,ytop)处的矩形
- rug 添加地毯图
- xspline 根据控制点(x,y)绘制x样条曲线(平滑曲线)
注意:plot是高级绘图函数,text是低级函数,所以不能单独运行低级函数,只能在高级基础上进行
3.绘图参数
par()函数来设置绘图的相关参数(字体、坐标轴、标题等),这种方式设置的绘图参数会对后续的绘图进程持续有效,除非你修改这些参数。
par() #查看当前的绘图参数
opar <- par() #复制当前的绘图参数
par(col.lab="red") #设置x轴和y轴标签为红色
par(opar) #恢复最初的绘图参数
大部分参数既可以在par()
中设置,又可以在plot()
中设置,区别在于前者设置的参数对全局起作用,后者设置的参数只对本条命令起作用,相当于plot()
中的...
参数,个别参数在两种情况下面对的对象也不同。还有,以下参数只能在par()
中使用:
- ask
- fig, fin
- lheight
- mai, mar, mex, mfcol, mfrow, mfg
- new
- oma, omd, omi
- pin, plt, ps, pty
- usr
- xlog, ylog
- ylbias
文本与符号:
主标题 main=“标题”
副标题 sub=“副标题”
轴标题 x轴:xlab="标题" , y轴:ylab="标题"
字体:
font | 指定使用的字体,1是普通字体, 2代表粗体, 3代表斜体。 |
- font.axis 指定坐标轴刻度字体
- font.lab 指定坐标轴标签字体
- font.main 指定主标题字体
- font.sub 指定副标题字体
- family 指定文本的字体家族
点—绘图符号:
pch=这个参数去指定图中点的形状,它的值是数字,不同数字代表不同的符号,对于21~25号,我们需要指定边框的颜色(col=)和填充色(bg=),cex=控制点状要素相对默认大小的倍数;。
点线绘图:
使用参数type=设置,点线的组合方式:
- type='p' 点
- type='l'线
- type='b' 点连线
- type='o' 线穿过点
- type='h' 悬垂线
- type='s' 阶梯线
线类型和宽度:
使用lty=设置不同的线类型,具体参数同为数字,比如虚线、实线等
参数取值 含义 lwd=1 默认宽度 lwd=k 默认宽度的k倍 lwd=-k 默认宽度的1/k倍
lend=:控制线状要素端点的形状,整型参数。0表示圆角,1表示短直角,2表示长直角;
颜色参数:
参数取值 用col=设置点的颜色,英文不能缩写,要写全,可以是RGB对应的编码值或者颜色名称,十六进制符。bg=设置背景色,fg=设置前景色。
- bg在
par()
设置时表示整个绘图页面的背景颜色,在plot()
设置时只表示绘图图形的背景色;- fg表示除绘图图形要素以外的几何图形的颜色,如边框、坐标轴刻度线。
坐标轴范围:
在plot函数中,用xlim=c(坐标轴的两个端点值)指定横坐标的范围,用ylim=指定纵坐标的范围
xaxp、yaxp:分别控制x轴和y轴刻度线标记的起始位置和间隔数量,形式为c(x1, x2, n)或c(y1, y2, n),依次表示刻度线起、始位置和间隔个数;
lab:控制坐标轴刻度个数,形式为c(x, y, len),默认值为c(5,5,7),依次表示x和y轴刻度个数,len为无效参数。
二级命名参数:
构成规则:主参数+要素关键字
关键字及含义:axis——坐标刻度值,lab——坐标轴标签,main——图形标题,sub——图形副标题;
颜色:col.axis、col.lab、col.main、col.sub;
大小:cex.axis、cex.lab、cex.main、cex.sub;
字体:font.axis、font.lab、font.main、font.sub。
其他常用参数:
排版 mfrow=c(行数,列数)
位置 pos=1表示下,2表示左,3表示上,4表示右
尺寸 pin=c(宽度值,高度值)
边界 mai=c(下边界大小值,左边界大小值,上边界大小值,右边界大小值)
4. 绘图实践练习
案例:某病人对2种药物(drugA和drugB)、5个剂量水平的响应情况。
dose <- c(20,30,40,45,60)
drugA <- c(16,20,27,40,60)
drugB <- c(15,18,25,31,40)
药物A的剂量与响应关系的图形:
par(mfrow=c(1,3))
plot(dose,drugA)
plot(dose,drugA,type="b")
plot(dose,drugA,type="b",
xlab = "Dosage",ylab="Response",
lty=1,pch=15)
lines(dose,drugB,type="b",lty=2,pch=17)
legend("topleft",title = "Drug type",
legend=c("A","B"),
lty=c(1,2),
pch=c(15,17))
legend()里面的点和线的属性必须与前面函数plot( )和line()中设置的属性一致。
4.1 绘制直方图
data(anorexia,package = "MASS")
hist(anorexia$Prewt)#绘制频数直方图的函数hist
没有设置参数时,hist对变量prewt的频数分布使用了默认的组距、坐标轴标签和标题。
hist(anorexia$Prewt,
breaks = 9,
freq = F,col="lightblue",
col.axis="blue",col.lab="black",
xlab = "体重",
main="治疗前后体重分布直方图",
las=1)
参数break可以设置分组,freq参数设置将坐标轴转换为频率,参数las=1,表示把纵坐标的刻度横向展示。
当需要加入概率密度曲线时,可以使用函数density()
plot(density(anorexia$Prewt))
lines(density(anorexia$Prewt),
lwd=3,
col="red")
rug(anorexia$Prewt) #添加轴须图,展示数据的分布密度趋势
如果直接绘制plot函数,会将原来的图片覆盖,如果想要图形上的叠加,只能使用上面介绍的常用绘图函数。
4.2 绘制条形图
(1)barplot()用于展示频数分布
案例:绘制某药物治疗类风湿性关节炎的疗效的条形图
library(vcd)
data("Arthritis")
attach(Arthritis)
counts <- table(Improved)
barplot(counts, #需要绘制的数据
xlab="Improvement",
ylab = "Frequency",
col="green",
las=1)
barplot(counts, #需要绘制的数据
xlab="Improvement",
ylab = "Frequency",
col=c("green","blue","red"),#把颜色设置为向量可以输出三个分组用不同的颜色
las=1)
(2)barplot( )用于展示二维列联表数据
案例:需要展示治疗组和对照组中,疗效的情况
barplot(counts,
col =c("red","yellow","green"),
xlab = "疗效",
ylab = "频数",
col.lab="black",
las=1)
barplot(counts,
col =c("red","yellow","green"),
xlab = "疗效",
ylab = "频数",
col.lab="black",
beside=T,#分开展示不同的疗效
las=1)
legend("top",legend = rownames(counts),
fill =c("red","yellow","green") )
(3)条形图展示均值,标准差等统计参数
epiDisplay包中的aggregate.plot()函数可以简化实现。
library(epiDisplay)
aggregate.plot(anorexia$Prewt,
by=list(anorexia$Treat),#分组信息,by=list()
error="sd",
legend = T,
bar.col =c("red","yellow","green"),
ylim = c(0,100),las=1,
main = "不同治疗方式组中治疗前体重")
图中的误差棒表示的是标准差,我们可以通过改变参数error的取值设置显示标准误或置信区间
4.3 饼图
percent <- c(5.8,27.0,0.5,20.8,12.8,33.1) #百分比值
disease <- c("上感","中风","外伤","晕厥","食物中毒","其他")
lbs <- paste0(disease,percent,"%")
pie(percent,labels = lbs,col = rainbow(6))
4.4 箱线图和小提琴图
箱线图(box plot)用于展示数据的分布特征,探索有无异常值或者离群值。
案例:治疗前后的体重变化
anorexia$wt.change <-anorexia$Prewt-anorexia$Postwt
boxplot(anorexia$wt.change,
ylab="weight change(lbs)",
las=1)
箱线图的内容:中间比较粗的是中位数,箱的上线是上四分位数,下线为下四分位数。在上边缘线和下边缘线之外的值通常被认为是异常值。
案例:比较不同治疗组的体重变化,增加了治疗的分组
boxplot(wt.change~Treat,data=anorexia,
ylab="weight change(lbs)",
col=rainbow(6),
las=1)
boxplot()函数中,第一个参数输入的是一个公式,R的公式一般用~连接变量,“~”的左边可以看作因变量,右边看作自变量。
小提琴图(violin plot)可以看作箱线图和密度图的结合,vioplot包中的vioplot()可用于绘制小提琴图
#install.packages("vioplot")
library(vioplot)
vioplot(wt.change~Treat,data=anorexia,
ylab="weight change(lbs)",
col=rainbow(6),
las=1)
4.5 克利夫兰点图
克利夫兰点图本质也是散点图,它通过点的位置展示数据的大小,是一种在简单水平刻度绘制大量有标签值得方法。函数dotchart( )用于绘制克利夫兰点图。
案例:数据集VADeaths数据集记录的是某地城市和农村不同年龄段的死亡率
data("VADeaths")
dotchart(VADeaths)
dotchart(VADeaths,pch = 19)
4.6 导出图片
通过export或者复制出来的图片一般会受到窗口大小影响,因此建议直接用代码保存。
pdf("mygraph.pdf")
dotchart(VADeaths,pch = 19)
dev.off()
保存成为pdf格式,还可以用png( ),jpeg( ),tiff(),postscript()等将图片保存为其他格式。bmp,png,jpg格式都是非矢量图片,tiff()较为出版物常用。
tiff(filename = "mygraph.tiff",#一定要有后缀,无论哪种格式
width = 15,height = 12,units = "cm",#设置图形的宽度和高度及单位
res=300)#res=设置分辨率
vioplot(wt.change~Treat,data=anorexia,
ylab="weight change(lbs)",
col=rainbow(6),
las=1)
dev.off()
ggplot2包作图
1.入门绘图模板
模板1:
ggplot(data=<DATA>)+
<GEOM_FUNCTION>(mapping=aes(<MAPPINGS>))
DATA:数据;GEOM_FUNCTION:GEOM开头的绘图函数;MAPPING:x,y轴模板2:
ggplot(data=<DATA>,mapping=aes(<MAPPING>))+
<GEOM_FUNCTION>
library(ggplot2)
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species))
#格式2:
ggplot(iris,mapping = aes(x=Sepal.Length,
y=Petal.Length,
color=Species))+
geom_point()
第二种思路比较容易理解和记住,笔者常用第二种格式。
ggplot2的特殊语法:列名不带引号,行末写加号
属性的设置,跟数据无关,只跟图形的形状颜色相关
手动设置:需要设置为有意义的值
颜色 color:字符串,blue,red等
大小:size:单位mm
形状:shape:有默认的图形编号
透明度:alpha
填充颜色:fill
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length),
color="blue")
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length),
color="red")
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length),
color="green",#点的颜色为绿色
size=5,#点的大小为5mm
alpha=0.5,#不透明度为50%
shape=8) #点的形状为8号形状
映射:按照数据框的某一列来定义图的某个属性,比如不同治疗方式用不同颜色表示。
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species))
#Species这一列有三个取值,默认为三个不同颜色
注意:color在aes函数的内外表示的意义不同。上述的代码中color是aes的参数,是列名作为映射,三种取值默认分配三种颜色对应不同分组。而下面的代码color是geom_point的参数,是具体的颜色,RGB,不能是列名。
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length),
color="red")
- 映射:根据数据的某一列的内容分配颜色
- 手动设置:把图形设置为一个或n个颜色,与数据内容无关
自行指定映射的颜色:
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species)) +
scale_color_manual(values = c("blue","grey","red"))#使用颜色名称
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species)) +
scale_color_manual(values = c("#666666","#808A87","#808069")) #使用RGB值作为颜色对象
其他属性可以将color改为size,shape等属性,eg:scale_size_manual()。注意:scale内的内容必须与color的种类数目匹配,如果没有指定color映射的对象,虽然不报错,但是scale不发挥作用。
color与fill的区别:
- shape的形状如果是实心或者空心的图时,只需要color就可以指定颜色;
- shape的形状如果是有边框的图形,内心的填充需要用fill指定,color指定的是边框的颜色
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species),
shape=2) +
scale_color_manual(values = c("blue","grey","red")) #空心图案
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species),
shape=17) +
scale_color_manual(values = c("#666666","#808A87","#000000")) #实心图案
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species),
shape=24,fill="black") +
scale_color_manual(values = c("blue","grey","red")) #带有边框的shape图形
2. 分面
分面是将整个数据按照某一个或几个分类变量分成多个子集,然后用这些子集分别作图。
使用facet_grid( )或facet_wrap( )函数,并指定根据哪个变量来分割数据。
#按列分面
ggplot(data=iris)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species)) +
scale_color_manual(values = c("blue","grey","red"))+
facet_wrap(~Species) #按照species这一列取值将图形分别画
#按行分面
dat=iris #不能在iris中修改,所以另外定义一个数据框。
dat$group=sample(letters[1:5],150,replace = T)
#letters是R语言自带的数据24个字母,从中取出第一个到第五个字母;150指的是从1:5中随机抽取150次,组合形成group这一列;repla=T可以重复抽取;
ggplot(data=dat)+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length,
color=Species)) +
scale_color_manual(values = c("blue","grey","red"))+
facet_grid(group~Species)
#facet_grid表示行按照group的取值分组,列按照species分组
2.2 分面函数的详细讲解(不需要可以跳过)
2.2.1 facet_wrap()按列分面
facets:分面变量;使用vars()函数加以引用。
(1)不添加分面变量时:
library(ggplot2)
data("mtcars")
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_wrap(vars())
ggplot(mtcars)+
geom_point(mapping=aes(x=mpg,y=qsec),
color="red",
shape=10)+
facet_wrap(vars())
(2)添加分面变量:以列gear作为分列变量
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_wrap(vars(gear))#gear有三个取值,3,4,5
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_wrap(~gear)
如果想要根据gear的取值对颜色进行映射?
mtcars1=mtcars
table(mtcars1$gear) #三个取值,便于输入几个颜色
str(mtcars1)
mtcars1$gear1=as.character(mtcars1$gear)
在映射时,按照分类的组别可以是数值型,字符型,但是要自定义颜色类型时,只能是字符型,所以需要将gear转化为新的列字符型的gear1
#默认的颜色映射
ggplot(mtcars1)+
geom_point(mapping = aes(x=mpg,y=qsec,color=gear),
shape=18)+
facet_wrap(vars(gear))
#自定义颜色映射
ggplot(mtcars1)+
geom_point(mapping = aes(x=mpg,y=qsec,color=gear1),
shape=18)+
scale_color_manual(values = c("red","blue","black"))+
facet_wrap(vars(gear))#facet_wrap后面的数据类型没有限制,可以是gear数值型,也可以是gear1字符型
常用参数:
1.nrow、ncol:控制分面后子图排列的行数或列数
ggplot(mtcars1)+
geom_point(mapping = aes(x=mpg,y=qsec,color=gear1),
shape=18)+
scale_color_manual(values = c("red","blue","black"))+
facet_wrap(vars(gear),nrow=2,ncol=2)
2. scales:控制子图坐标刻度是否保持一致。fixed表示子图的横、纵坐标都保持一致;free表示各子图坐标刻度自由变化;free_x、fix_y分别表示允许横、纵坐标自由变化。
ggplot(mtcars1)+
geom_point(mapping = aes(x=mpg,y=qsec,color=gear1),
shape=18)+
scale_color_manual(values = c("red","blue","black"))+
facet_wrap(vars(gear),nrow=1,ncol=3,
scale="free_y")
y轴自由变化,x轴横坐标固定一致
3. labeller:修改子图标题格式。
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_wrap(vars(gear), nrow = 1,
labeller = label_both)
4. as.table:修改子图排列顺序。TRUE表示分面变量数值越大对应的子图越靠近左下方;FALSE表示数值越大越靠近右上方。 5. drop:当分面变量是因子类型时,是否删除没有对应样本的因子水平。
6. dir:控制子图排列顺序。h(默认值)表示水平排序,即先左右、后上下;v表示垂直排序,即先上下、后左右。
7. strip.position:控制子图标题位置(top、bottom、left、right)。eg:strip.position = "bottom"
2.2.2 facet_grid( )分面变量
可以分面行也可以分面列:
#行分面变量
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_grid(rows = vars(gear),
labeller = label_both)
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_grid(gear~.,
labeller = label_both)
#列分面变量
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_grid(cols = vars(vs),
labeller = label_both)
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_grid(. ~ vs,
labeller = label_both)
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_grid(rows = vars(gear),
labeller = label_both) #行分面
ggplot(mtcars,aes(mpg,qsec))+
geom_point()+
facet_wrap(vars(gear),nrow=3,
labeller = label_both) #列分面设置行数达到行分面
比较图形区别:
行列同时分面:
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_grid(gear ~ vs,
labeller = label_both)
可以利用margin参数增加边际值:
ggplot(mtcars, aes(mpg, qsec)) +
geom_point() +
facet_grid(gear ~ vs,
margins = c("gear", "vs"),
labeller = label_both)
3. 几何对象——图形叠加
一个geom函数绘制出来的图像叫做一个几何对象,几何对象可以叠加。
library(ggplot2)
ggplot(iris)+
geom_smooth(mapping=aes(x=Sepal.Length, #局部,只对当前图层有效
y=Petal.Length))+
geom_point(mapping=aes(x=Sepal.Length,
y=Petal.Length))
#或者
ggplot(iris,aes(Sepal.Length,Petal.Length))+ #全局,对于所有几何对象有效
geom_point()+
geom_smooth()
两种方法的本质区别在于:第一种数据在于局部的geom函数种可以调整不同图形的数据,具有各种图形的独立性;第二种数据是统一的,所有的图基于同一组数据产生。
4. ggplot2的其他绘图
4.1 ggplot2的其他参数
主题(theme)函数用于定义绘图的风格。
#没有主题
ggplot(iris,aes(Sepal.Length,Petal.Length))+
geom_point()+
geom_smooth()
#添加经典主题
ggplot(iris,aes(Sepal.Length,Petal.Length))+
geom_point()+
geom_smooth()+
theme_classic()
位置关系
- geom_point:绘制的点绘制在一条线上不能分开
- geom_jitter:绘制可以将点散落开
ggplot(iris,aes(x=Species,y=Sepal.Length))+
geom_boxplot(aes(color=Species))
ggplot(iris,aes(x=Species,y=Sepal.Length))+
geom_boxplot(aes(color=Species))+
geom_jitter(aes(color=Species))
坐标系
- coord_flip()翻转坐标系
- coord_polar()极坐标系
#ggplot绘图完整模板
#ggplot(data=<DATA>)+ #DATA数据
# <GEOM_FUNCTION>(mapping=aes(<MAPPINGS>),
# stat=<STAT>, #STAT统计变换,“identity”
# position=<POSITION>)+ #位置关系,是否是散落
# <COORDINATE_FUNCTION>+ #坐标系
# <FACET_FUNCTION>
4.2 频数统计条形图geom_bar
单因素:
ggplot(data=diamonds)+
geom_bar(mapping=aes(x=cut)) #cut是需要统计频数的列,分类变量
#或
ggplot(data=diamonds)+
stat_count(mapping=aes(x=cut))
ggplot(data=diamonds)+
geom_bar(mapping = aes(x=cut,y=Fred),stat="identity")
#Fred是已经统计好的频数,如果不想要系统统计,需要指定y,则需要加入函数stat=“identity”
两因素:
data("Arthritis",package = "vcd")
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
geom_bar(color="black")+
scale_fill_brewer()+
theme_bw()
通过增加参数position=fill实现展示相对比例,position=dodge将条形图并排放置。
data("Arthritis",package = "vcd")
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
geom_bar(color="black",position = "fill")+
scale_fill_brewer()+
theme_bw()
data("Arthritis",package = "vcd")
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
geom_bar(color="black",position = "dodge")+
scale_fill_brewer()+
theme_bw()
4.3 频数比例图
ggplot(diamonds)+
geom_bar(mapping=aes(x=cut,y=..prop..,group=1))
#..prop..表示显示百分比,group=1表示总的值为1,总体是总频数
ggplot(diamonds)+
geom_bar(mapping=aes(x=cut,y=..prop..))
#去掉group=1,则每个取值都被认为是总体,所以所有组都是100%
4.3 频数分布直方图
data(anorexia,package = "MASS")
anorexia$wt.change <-anorexia$Prewt-anorexia$Postwt
绘制体重变化的直方图:
#基础包绘图
hist(anorexia$wt.change,breaks=16,
col="skyblue",
xlab = "Weight Change(lbs)",
las=1)
#ggplot2
ggplot(anorexia,aes(x=wt.change))+
geom_histogram(binwidth = 2,fill="skyblue",color="black")+
labs(x="Weight Change(lbs)")+
theme_bw()
上述频数分布图,binwidth用于设置组具,默认值为全距除以30,参数fill用于设置填充的颜色,color用于设置矩形边框的颜色。如果要实现频率分布直方图
#基础包绘图
hist(anorexia$wt.change,breaks=16,
freq = F,
col="skyblue",
xlab = "Weight Change(lbs)",
las=1)
lines(density(anorexia$wt.change),
col="black",
lty=2,
lwd=3)
dev.off()
#ggplot2
ggplot(anorexia,aes(x=wt.change,y=..density..))+
geom_histogram(binwidth = 2,fill="skyblue",color="black")+
stat_density(geom = "line",linetype="dashed",size=1)+
labs(x="Weight Change(lbs)")+
theme_bw()
基础包使用freq=F实现频率转换,再用低级函数lines绘制密度图,ggplot2在aes函数中y=..density..实现频率,stat_density( )是一种用于计算密度估计曲线的统计变换。比较不同治疗组的密度曲线时,可以将 linetype设置为分组变量treat。
ggplot(anorexia,aes(x=wt.change,color=Treat,linetype=Treat))+
stat_density(geom = "line",size=1)+
labs(x="Weight Change(lbs)")+
theme_bw()
color和linetype进行了映射,所以放在了aes函数中。
4.4 箱线图
ggplot(anorexia,aes(x=Treat,y=wt.change,fill=Treat))+
geom_boxplot()+
geom_jitter()+
theme_bw()
fill是填充的颜色,col是边框颜色注意区分
如果要对数据进行比较,需要进行假设检验,ggpur包提供了在平行箱线图上添加组间比较的统计学差异的功能。
比如对上述三个组进行均值的比较:
#install.packages("ggpubr")
library(ggpubr)
my_comparison <- list(c("CBT","Cont"),c("CBT","FT"),c("FT","Cont"))
ggplot(anorexia,aes(x=Treat,y=wt.change,fill=Treat))+
geom_boxplot()+
stat_compare_means(comparisons = my_comparison,
method = "t.test",
color="blue")+
theme_bw()
5. ggplot绘图的保存
函数ggsave()专门用来保存ggplot2包绘制的图形,可以导出为不同格式的图片
library(ggplot2)
p <- ggplot(mtcars,aes(wt,mpg))+
geom_point()
ggsave("myplot.png",p)
ggsave("mtplot.pdf",p)
ggsave("myplot.tiff",width = 15,height = 12,units = "cm",dpi = 500)
ggplot绘制的图形不能使用par()函数组合,可以使用拼图包patch包
#R包:patchwork
install.packages("patchwork")
library(patchwork)
p <- ggplot(mtcars,aes(wt,mpg))+
geom_point()
q <- ggplot(mtcars,aes(wt))+
geom_boxplot()
p+q