How To Use ggplot2

时间:2023-03-09 16:01:22
How To Use ggplot2

0. Preparation and Introduction

ggplot2是R中新颖的数据可视化包,这得益于Leland Wilkinson在他的著作《The Grammar of Graphics》中提出了一套图形语法,把图形元素抽象成可以*组合的成分,Hadley Wickham把这套想法在R中实现。

1. How to use qplot

函数qplot()是ggplot2中十分常用的函数,使用它可以绘制丰富多彩的图形,并且通常只需要一行代码可以搞定。在这里,我们通过R内置的钻石数据包(diamonds)来模拟使用qplot函数的过程。

数据预处理:由于钻石数据量比较大,一步步运行操作可能会导致系统缓慢或者图像不清晰等问题,所以对钻石数据进行必要的预处理,使其数据量变小。

set.seed(1410)#让样本可重复
dsmall<-diamonds[sample(nrow(diamonds),100),]#小数据作图展示

1.1 Colour & Shape  

library(ggplot2)
qplot(carat,price,data=dsmall,colour=color)#将color变量映射到点的颜色
qplot(carat,price,data=dsmall,shape=cut)#cut->形状

How To Use ggplot2How To Use ggplot2

上述两幅图是分别设置了颜色(左图)和形状(右图)参数的carat-price散点图。可以明显看出,qplot()函数对于颜色和形状设置的表达十分简练,不需要像plot()函数那样需要多行代码才能完成绘图,这里初步展示了该函数的使用方法。

qplot(carat,price,data=diamonds,alpha=I(1/10))#alpha=I()改变点的透明度

上一行代码通过改变alpha=I(1/10)这个参数来实现点的透明度改变,其中I()内的参数为透明度,数值越小,透明度越高。图形如下所示:

How To Use ggplot2

1.2 geom.smooth & Point

qplot(carat,price,data=dsmall,geom=c("point","smooth"))
#point绘制散点图,smooth拟合平滑曲线(展示标准误,可用se=FALSE取消),n较小时method="loess"默认局部回归
qplot(carat,price,data=dsmall,geom=c("point","smooth"),span=0.2)
#span设置曲线平滑程度0(很不平滑)->1(很平滑)
#若数据量大于1000,可以使用mgcv包

How To Use ggplot2How To Use ggplot2

上述两图为carat-price的散点图,数据来源于dsmall,并且geom()参数赋予相应的功能(散点图与回归线)。其中,右图拟合曲线的平滑程度为0.2(平滑程度低)。

1.2 geom.boxplot

qplot(color,price/carat,data=diamonds,geom="jitter",alpha=I(1/50))#绘制扰动点图geom="jitter"

这里绘制的是扰动点图,若要绘制箱线图,则使用的是geom="boxplot"参数。

How To Use ggplot2

1.2 geom.histogram & density

qplot(carat,data = diamonds,geom = "histogram",binwidth=0.1,xlim=c(0,3))#直方图,binwidth可以改变最小组距

参数geom = "histogram"用来绘制直方图(如下所示),binwidth可以改变组距。

How To Use ggplot2

qplot(carat,data = diamonds,geom = "density")#密度曲线图

参数geom = "density"用来绘制密度曲线图(如下所示):

How To Use ggplot2

 

你也可以对每一种颜色(Colour)变量分类绘制不同颜色钻石的密度曲线和直方图:

qplot(carat,data = diamonds,geom = "density",colour=color)
qplot(carat,data = diamonds,geom = "histogram",fill=color)

How To Use ggplot2How To Use ggplot2

1.2 geom.bar

qplot(color,data=diamonds,geom="bar",weight=carat)+scale_y_continuous("carat")

利用参数geom="bar"来绘制条形图(如下所示)。若想改变坐标轴的标题的话,可以这样写:

qplot(color,data=diamonds,geom="bar",weight=carat) +labs(y="克拉",x="颜色")
#scale_y_continuous修饰图形+改坐标轴名称(continuous连续)

How To Use ggplot2

1.3.Point

qplot(displ,hwy,data=mpg,color=factor(cyl))

qplot默认设置为散点图,可以使用factor()函数将图像按照分类变量分类填色,效果如下所示:

How To Use ggplot2

 

  

2. How to use ggplot

2.1 try

ggplot(diamonds,aes(carat,price,colour=cut))#这个图形再加上图层之前什么也看不到

How To Use ggplot2

bestfit<-geom_smooth(method = "lm",se=F,colour=alpha("steelblue",0.5),size=2)
qplot(sleep_rem,sleep_total,data=msleep)+bestfit

 How To Use ggplot2

qplot(awake,brainwt,data=msleep,log="y")+bestfit

How To Use ggplot2

qplot(bodywt,brainwt,data=msleep,log="xy")+bestfit#创建一个带有透明深蓝色回归线的图层

How To Use ggplot2

2.2 try  

p<-ggplot(mtcars,aes(mpg,wt))
p+geom_point(colour="darkblue")

How To Use ggplot2

p+geom_point(aes(colour="darkblue"))#比较两者的不同

How To Use ggplot2

2.3 try

p<-ggplot(diamonds,aes(x=carat))
p+layer(
geom="bar",
position = "identity",
stat="bin",
params=list(fill="steelblue",binwidth=2)
)

How To Use ggplot2

以下代码是错误的,新版本没有geom_params和stat_params这两个变量:

p<-ggplot(diamonds,aes(x=carat));p<-p+layer( geom="bar",geom_params=list(fill="steelblue"),stat="bin",stat_params=list(binwidth=2))

2.4 group

Example 1:

nlme包里的一个简单的纵向数据集Oxboys。该数据记录了26名男孩(Subject)在九个不同时期(Occasion)所测定的身高(height)和中心化后的年龄(age)。

library(nlme)
pOxboys<-ggplot(Oxboys,aes(age,height,group=Subject))+geom_line()#geom_line()来连线
pOxboys#正确分组,每条线代表一个男孩

How To Use ggplot2

pOxboysx<-ggplot(Oxboys,aes(age,height))+geom_line()
pOxboysx#错误分组,先撒点在连线(默认group=1)

How To Use ggplot2

#如果想给所有男孩增加一条光滑曲线
pOxboys+geom_smooth(aes(group=Subject),method = "lm",se=F)#但是实际上我们为每一个男孩都添加了一条光滑曲线

How To Use ggplot2

pOxboys+geom_smooth(aes(group=1),method = "lm",se=F)

How To Use ggplot2

 

2.5 Stat

ggplot(diamonds,aes(x=carat))+geom_histogram(aes(y=..density..),binwidth = 0.1)

How To Use ggplot2

这里的..density..是一种新语法,他告诉ggplot2将密度而不是频数映射到y轴

2.6 TRY

d<-ggplot(diamonds,aes(carat))+xlim(0,3)
d+stat_bin(aes(ymax=..count..),binwidth = 0.1,geom="area")

How To Use ggplot2

d+stat_bin(aes(size=..density..),binwidth = 0.1,geom="point",position="identity")

How To Use ggplot2