气泡图
除了三维散点图可以对三个变量的关系进行可视化之外,气泡图同样也能展示三个变量的可视化关系,它的原理是:先创建一个二维散点图,然后用点的大小来代表第三个变量的值。
我们可以用symbols()函数来创建气泡图,该函数可以在指定的坐标上绘制圆圈图、方形图、星形图、温度计图和箱线图。以绘制圆圈图为例:
symbols(x,y,circle=radius)
其中x、y和radius是需要设定的向量,分别表示x、y坐标和圆圈半径。如果我们想用面积而不是半径来表示第三个变量,那么按照圆半径的计算公式变换即可:
symbols(x,y,circle=sqrt(z/pi))
z即第三个要绘制的变量,pi表示圆周率。
现在我们把该方法用到mtcars数据集上,x轴代表车重,y轴代表每加仑英里数,气泡大小代表发动机排量。代码如下:
> attach(mtcars)
> r<-sqrt(disp/pi)
> symbols(wt,mpg,circle = r, inches = 0.30,
+ fg="white",bg="lightblue",
+ main="Bubble Plot with point size proportional to displacement",
+ ylab = "Miles Per Gallon",
+ xlab = "Weight of Car (1bs/1000)")
> text(wt,mpg,rownames(mtcars),cex = 0.6)
> detach(mtcars)
其中inches是比例因子,控制着圆圈大小(默认最大圆圈是1英寸)。text()函数用来添加各个汽车的名称。从生成的图形中可以看到,随着每加仑汽油所行使里程的增加,车重和发动机排量都逐渐减少。
一般说来,统计人员使用R语言时倾向于避免用气泡图,原因和避免使用饼图一样:相比对长度的判断,人们对体积/面积的判断通常更加困难。但是气泡图在商业应用中非常受欢迎。
折线图
如果将散点图上的点连接起来,那么就会得到一个折线图。以基础包安装中的orange数据集为例,它包含五种橘树的树龄和年轮数据。现要考察第一种橘树的生长情况,分别创建散点图和折线图,分析代码如下:
> #创建折线图与散点图
> opar <- par(no.readonly = TRUE)
> par(mfrow=c(1,2))
> t1<-subset(Orange,Tree==1)
> plot(t1$age,t1$circumference,
+ xlab = "Age (days)",
+ ylab = "Circumference (mm)",
+ main = "Orange Tree 1 Growth")
> plot(t1$age,t1$circumference,
+ xlab = "Age (days)",
+ ylab = "Circumference (mm)",
+ main = "Orange Tree 1 Growth",
+ type = "b")
> par(opar)
折线图一般可用下列两个函数之一来创建:
plot(x,y,type=)
lines(x,y,type=)
其中,x、y是要连接的(x,y)的数值型向量,参数type的可选值如下:
下图是各种type值的示例:
下面我们以绘制五种橘树随时间推移的生长状况为例,逐步展现一个更复杂折线图的创建过程,每种树都有自己独有的线条:
> # 将因子转化为数值型
> Orange$Tree<-as.numeric(Orange$Tree)
> ntrees <- max(Orange$Tree)
> # 创建图形
> xrange<-range(Orange$age)
> yrange<-range(Orange$circumference)
> plot(xrange,yrange,
+ type = "n",
+ xlab = "Age (days)",
+ ylab = "Circumference (mm)"
+ )
> colors<-rainbow(ntrees)
> linetype<-c(1:ntrees)
> plotchar<-seq(18,18+ntrees,1)
> # 添加线条
> for (i in 1:ntrees){
+ tree <- subset(Orange,Tree==i)
+ lines(tree$age, tree$circumference,
+ type = "b",
+ lwd = 2,
+ lty = linetype[i],
+ col = colors[i],
+ pch = plotchar[i]
+ )
+ }
> # 添加标题和图例
> title("Tree Growth", "example of line plot")
> legend(xrange[1],yrange[2],
+ 1:ntrees,
+ cex = 0.8,
+ col = colors,
+ pch = plotchar,
+ lty = linetype,
+ title = "Tree"
+ )
上述代码中,plot()函数先用来创建空图形,只设定了轴标签和轴范围,并没有回执任何数据点,每种橘树独有的折线和点都是随后通过lines()函数来添加。可以看到,Tree4和Tree5在整个时间段中已知保持着最快的生长速度,而且Tree5在大约664天时超过了Tree4的生长速度。