R语言实战 ggplot2包的应用

R语言实战第19章 ggplot2画图

1.  前言

图形系统有grid包、lattice包、ggplot2包,其中grid包控制图形基础单元,latteric包通过一维,二维或者三维条件绘图,对多元变量关系进行直观展示。Ggplot2包则是基于全面图形的语法进行的一种绘图。

而在ggplot2包中,图是通过串联起来(+)号的函数创建,每个函数修改属于自己的部分

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

geom_point()+

labs(title="automobile data",xlab="weight",ylab="milesper gallon")


ggplot()绘图时要先制定数据来源以及变量,aes()函数的功能是制定每个变量扮演的角色,geom_plot()是只是在图形中画点,创建散点图,labs()函数是可选,添加注释。

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

 geom_point(pch=20,color="blue",size=2)+

 geom_smooth(method="lm",color="red",linetype=2)+

  labs(title="automobiledata",xlab="weight",ylab="miles per gallon")


这里采用geom_point()函数设置点的形状为圆形,pch=20,大小为2(size=2),使用过了蓝色,geom_smooth()函数来添加了一条平滑曲线,采用了线性拟合和红色的虚线(linetype=2)且线条尺寸为1,ggplot2包提供了分组和小棉花的方法,分组即是在一个图形中显示两组或者是多组的观察结果,小棉花是指在单独的并排的图形上显示观察组,

ggplot(data=mtcars,aes(x=hp,y=mpg,shape=cyl,color=cyl))+

  geom_point(size=3)+

  facet_grid(am~vs)+

  labs(title="automaticdata by engine type",

      x="horsepower",y="miles per gallon")


2.  用集合函数指定图的类型

Ggplot包中较常用的函数如下

几何函数

函数

添加

选项

Geom_bar()

条形图

Color、fill、alpha

Geom_boxplot()

箱线图

color、fill、alpha、notch、width

Geom_density()

密度图

color、fill、alpha、linetype

Geom_histogram()

直方图

color、fill、alpha、linetype、binwidth

Geom_hline

水平线

color、alpha、linetype、size

Geom_jitter()

抖动点

Color、size、alpha、shape

Geom_line()

线图

Colorvalpha、linetype、size

Geom_point()

散点图

Color、alpha、shape、size

Geom_rug()

地毯图

Color、side

Geom_smooth()

拟合曲线

Method、formula、color、fill、linetype、size

Geom_text()

文字注释

 

Geom_violin

小提琴图

color、fill、alpha、linetype

Geom_vline

垂线

Color、alpha、linetype、size

 

ggplot(singer,aes(x=height))+geom_histogram()

ggplot(singer,aes(x=voice.part,y=height))+geom_boxplot()


可见低音歌唱家比高音歌唱家身高更高。

常见的函数选项

选项

详述

Color

对点、线和填充区域的边界进行着色

Fill

对填充区域着色,如条形和密度区域

alpha

颜色的透明度,从0(完全透明)到1(不透明)

linetype

图案的线条(1=实线、2=虚线、3=点、4=点破折号、5=长破折号、6=双破折号)

size

点的尺寸和线的宽度

shape

点的形状(0=开放的方形,1=开放的圆形,2=开放的三角形等)

position

绘制注入条形图和点等对象的位置,对条形图来说,“dodge”将分组条形图并排,“stacked”堆叠分组条形图,“fill”垂直的堆叠分组条形图并规范其高度相等

notch

表示方块图是否为缺口

sides

地毯图的安置(“b”=底部,“l”=左部,“r”=右部,”t”=顶部,“bl”=左下)

Width

箱线图的宽度

ggplot(Salaries,aes(x=rank,y=salary))+

 geom_boxplot(fill="cornflowerblue",

  color="black",notch=T)+

 geom_point(position="jitter",color="blue",alpha=0.5)+

 geom_rug(side="l",color="black")


地毯图设在左侧,只是了薪水的一般扩散,该图画了不同学术地位对薪水的缺口箱线图,对观测点采用了一般的透明化以防止遮挡了箱线图。当图形结合时,产生的图形如下:

ggplot(singer,aes(x=voice.part,y=height))+

 geom_violin(fill="lightblue")+

 geom_boxplot(fill="lightgreen",width=0.2)


3.  分组

通常会在一个图中话两个或者更多组的观察值方便理解数据,在R中,通常用分类变量的因子来定义,分组通过ggplot2图将一个活多个带有注入形状、颜色、填充、尺寸和线条型的视觉特征的分组变量完成。

通过探讨工资数据集画相关图形

ggplot(Salaries,aes(x=salary,fill=rank))+

  geom_density(alpha=0.3)


通过画出不同的密度曲线并以不同的颜色区分,展现出不同教育水平的工资不同,且设置了透明度,防止不同的密度图被覆盖,接下来探索通过性别与学术等级分组,绘制获得博士学位年数与薪水的关系。

ggplot(Salaries,aes(x=yrs.since.phd,y=salary,color=rank,shape=sex))+

  geom_point()


由图可见,薪水随着毕业年数的增加而增加,但关系并非线性,就直观来看,男性取得较高薪水的比例较大,且学位越高,薪水越高。

ggplot(Salaries,aes(x=rank,fill=sex))+

 geom_bar(position="stack")+

 labs(title='position="stack')

ggplot(Salaries,aes(x=rank,fill=sex))+

 geom_bar(position="dodge")+

  labs(title='position="dodge')

ggplot(Salaries,aes(x=rank,fill=sex))+

 geom_bar(position="fill")+

 labs(title='position="fill')


将分组变量通过三种不同形式的图形进行比较,可以看出教授的人数大于其他学术水平的人数,且女性教授的人数比其他学术水平的人数要少,第三个表示女性教授的少于男性。且较该注意的是aes()函数内部一般只是用来分配变量。

4.刻面

若在图中并排出现并不是重围为单一的图形,即可用facet_wrap()函数和facet_grid()函数来创建网格图形。

Ggplot刻面图函数

语法

结果

facet_wrap(~var,ncol=n)

将每个var水平排列成n列的独立图

facet_wrap(~var,nrow=n)

将每个var水平排成n行的独立图

facet_grid(rowvar~colvar)

Rowvar和colvar组合的独立图,其中rowvar表示行,colvar表示列

facet_grid(rowvar~.)

每个rowvar水平的独立图,配置成一个单列

facet_grid(.~colvar)

每个colvar水平的独立图,配置成一个单行

ggplot(data=singer,aes(x=height))+

  geom_histogram()+

 facet_wrap(~voice.part,nrow=4)


该图画出了不同的音位的歌唱家身高直方图

ggplot(Salaries,aes(x=yrs.since.phd,y=salary,color=rank,shape=rank))+

  geom_point()+

  facet_grid(.~sex)


该图画出了不同性别之间,根据不同学历和不同的取得博士学位的薪水分布。

ggplot(singer,aes(x=height,fill=voice.part))+

  geom_density()+

  facet_grid(voice.part~.)


4.      添加光滑曲线

可用geom_smooth()函数来添加一系列的平滑曲线和置信区间,参数表如下:

geom_smooth()函数

选项

描述

Method=

使用的平滑函数,允许的值包括glm、lm、smooth、rlm、gam分别对应广义线性,线性,健壮线性和广义相加模型,smooth是默认值

Formula=

在光滑函数中使用的公式,包括y~log(x),y~poly(x,n)表示n次多项式拟合y~ns(x,n)表示一个具有n个自由度的样条拟合。

Se

绘制置信区间(T/F)默认为T

Level

使用的置信区间水平(默认为95%)

Fullrange

制定拟合应涵盖全图(T)或仅仅是数据(F)(默认为F)

图例:ggplot(Salaries,aes(x=yrs.since.phd,y=salary))+

        geom_smooth()+

                 geom_point()


该图显示了博士毕业年数与薪水之间的关系外加一条95%的置信区间的光滑曲线,再看个按照性别拟合一个二次多项式的例子。

ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary,linetype=sex,shape=sex,color=sex))+

 geom_smooth(method=lm,formula=y~poly(x,2),

             se=F,size=1)+

  geom_point(size=2)


对于男性来说,获得博士学位30年后薪水开始下降,对于女性,取得博士学位后薪水会一直上涨(在40年内),且数据集中没有女性的数据超过40年。

5.      修改ggplot2图形的外观

ggplot2提供了特定的函数来改变其图形的外观,我们将使用几个函数来自定义ggplot2的图形外观,

5.1坐标轴

该包在创建图时自动创建刻度线,刻度标记标签和坐标轴标签,可用过labs()函数来添加标题并改变坐标轴的标签,在本节中,将自定义轴标签,下表采用了自定义坐标轴的函数。

控制坐标轴和刻度线外的函数

函数

选项

Scale_x_continuous()和scale_y_continuous()

Breaks=指定刻度标记,labels=指定刻度标记标签,limits=控制要展示的值的范围

Scale_x_discrete()和scale_y_discrete()

Breaks=对因子的水平进行防治和排序,Labels=是制定这些水平的标签,limits=表示哪些水平应该展示

Coor_flip()

颠倒x轴和y轴

data(Salaries,package="car")

ggplot(data=Salaries,aes(x=rank,y=salary,fill=sex))+

  geom_boxplot()+

 scale_x_discrete(breaks=c("AsstProf","AssocProf","Prof"),#对水平因子进行放置和排序

                   labels=c("Assistant\nProfessor",

                           "Associate\nProfessor",

                           "Full\nProfessor"))+

                   scale_y_continuous(breaks=c(50000,100000,150000,200000), #breaks标记刻度,lebels标记刻度标签

                    labels=c("$50k","$100k","$150k","$200k"))+

  labs(titles="faculty salary by rank andsex",x="",y="")


图示可以看的,随着学术水平上升,薪水水平也会上升,而每个学术等级中,男性平均工资水平都高于女性平均工资水平。

5.2图例

图例即是指出如何用颜色、形状、尺寸等视觉特性表示数据特征,当在更改图例的标题时,可以更改其颜色,填充,尺寸,形状或他们的组合等。且可通过将fill=”mytitle”加到labs()函数中来改变我们要的标题。而标题的位置可以用theme()函数中的legend.position选项控制,可能的值有“left”、“top”、“right”、“bottom”可以在图中给定的位置指定一个二元素向量。

ggplot(data=Salaries,aes(x=rank,y=salary,fill=sex))+

  geom_boxplot()+

 scale_x_discrete(breaks=c("AsstProf","AssocProf","Prof"),

                  labels=c("Assistant\nProfessor",

                            "Associate\nProfessor",

                           "Full\nProfessor"))+

 scale_y_continuous(breaks=c(50000,100000,150000,200000),

                    labels=c("$50k","$100k","$150k","$200k"))+

  labs(title="faculty salary by rank andgender",

       x="",y="",fill="Gender")+

  theme(legend.position = c(.1,.8)) #放在左边边缘的10%和底部边缘的80%

若想删除图例,采用的是legend.poistion=”none”


5.3标尺

    标尺即是将数据空间的观测值给反映到可视化空间里面,标尺可以用于连续的变量,也可以用到离散的变量,连续性的标尺将yrs.snce.phd变量的数值映射到x轴上,同时把salary的数值给映射到Y轴上。

ggplot(data=mtcars,aes(x=wt,y=mpg,size=disp))+

 geom_point(shape=21,color="black",fill="cornsilk")+

 labs(x="weight",y="mpg",title="bublechart",size="engine\nDisplacement")


ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary,color=rank))+

 scale_color_manual(values=c("orange","olivedrab","navy"))+

  geom_point(size=2)


用scale_color_manual()函数设定三个学术等级的点的颜色,也可以用scale_color_brewer()和scale_fill_brewer()函数来预先制定分得清的颜色。

ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary,color=rank))+

 scale_color_brewer(palette="Set1")+

 geom_point(size=2)


5.4主题

    采用theme()函数中的选项来让我们调整字体,背景,颜色,和网格线条等。主题可以使用一次,也可以使用后保存期,用于多个图形。

mytheme<-theme(plot.title=element_text(face="bold.italic",

                                      size="14",color="brown"),

               axis.title =element_text(face="bold.italic",size=10,

                                        color="brown"),

               axis.text =element_text(face="bold",size=9,

                                       color="darkblue"),

              panel.background=element_rect(fill="white",

                                             color="darkblue"),

               panel.grid.major.y=element_line(color="grey",

                                               linetype = 1),

              panel.grid.minor.y=element_line(color="grey",

                                               linetype=2),

               panel.grid.minor.x=element_blank(),

               legend.position= "top")

ggplot(Salaries,aes(x=rank,y=salary,fill=sex))+

  geom_boxplot()+

  labs(title="salary byrank and sex",x="rank",y="salary")+

  mytheme


5.5多重图

    Ggplot包中将多个图形放到单个图形的方法为使用gridExtra包中的grid.arrange()函数,故在事先需首先下载gridExtra包

library(gridExtra)

p1<-ggplot(data=Salaries,aes(x=rank))+geom_bar()

p2<-ggplot(data=Salaries,aes(x=sex))+geom_bar()

p3<-ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary))+geom_point()

grid.arrange(p1,p2,p3,ncol=3)


借此,即可把不同的图合并到同个界面中。

6.      保存图形

使用ggsave()函数将ggplot画出的图来将其保存。

myplot<-ggplot(data=mtcars,aes(x=mpg))+geom_histogram()

ggsave(file="mygraph.png",plot=myplot,width=5,height=4)

这段将会把画图文件保存在当前路径的文档里,且命名为mygraph,倘若忽略了Plot参数,则R会自动保存最近做的图。

你可能感兴趣的:(r语言,ggplot2)