2.R语言绘图基本知识

文章介绍了R语言的基础绘图系统,包括plot函数及其各种图形类型,以及常用绘图参数的设置。接着详细讲述了ggplot2包的绘图原理,如入门模板、分面、几何对象等,并给出了实际绘图案例,如直方图、条形图、饼图、箱线图和小提琴图。文章还讨论了如何保存ggplot2的图形。
摘要由CSDN通过智能技术生成

目录

R的基础绘图系统

1. plot函数

2. 常用绘图函数

3.绘图参数

4. 绘图实践练习

ggplot2包作图

1.入门绘图模板

2. 分面

 3. 几何对象——图形叠加

4. ggplot2的其他绘图

5. ggplot绘图的保存


R的基础绘图系统

1. plot函数

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

  • 3
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值