R语言 | 折线图和趋势线拟合
今天介绍几个用R绘制折线图、点线图或者在散点图的基础上添加拟合趋势线的方法 (PS:基于base的方法,非ggplot)。
matplot
第一个要介绍的是matplot函数,这是一个类似于plot的函数,其绘图参数也与plot非常类似。
matplot(x, y, type = "p", lty = 1:5, lwd = 1, lend = par("lend"),
        pch = NULL,
        col = 1:6, cex = NULL, bg = NA,
        xlab = NULL, ylab = NULL, xlim = NULL, ylim = NULL,
        log = "", ..., add = FALSE, verbose = getOption("verbose"))各参数意义:
- x和y为绘图矩阵数据中用于绘图的向量; 
- type为图像的类型,参数与plot一致; 
- lty定义绘图的线型; 
- lwd定义绘图的线宽; 
- lend定义线末端的形式; 
- pch定义点的图标; 
- col为图中线和点的边框颜色; 
- cex定义点的大小; 
- bg为点的填充颜色; 
- xlab和ylab为x和y轴标签; 
- xlim和ylim为x和y轴范围; 
- add定义图像是否添加到已有的图像上; 
- verbose如果为TRUE,则返回一行内容,写着都做了什么。 
具体个参数的设置可以参考之前的推文《》。
⚠️x和y两个向量内元素的数目要一致,如果只提供了一个向量,则默认为y,x以由1开始的连续整数代替。
matplot允许绘图数据中包含NA。
接下来给几个绘图的例子,先做一个最简单的。
matplot((-4:5)^2, main = "Quadratic")绘制一个点线图。
sines <- outer(1:20, 1:4, function(x, y) sin(x / 20 * pi * y))
matplot(sines, pch = 1:4, type = "o", col = rainbow(ncol(sines)))修改图中点的形状并填充颜色。
matplot(sines, type = "b", pch = 21:23, col = 2:5, bg = 2:5,
        main = "matplot(...., pch = 21:23, bg = 2:5)")plot函数添加趋势线
拟合曲线的后期添加可以使用abline和lines函数完成,首先我们要使用plot函数绘制一个散点图。
attach(mtcars)
plot(mtcars$wt,mtcars$mpg,
     main="Basic Scatter plot of MPG vs.Weight",
     xlab="Car Weight(lbs/100)",
     ylab="Miles Per Gallon",
     pch=19)abline函数向图像中添加的是一条直线,例如数据的一元线性回归拟合结果。
abline(lm(mtcars$mpg~mtcars$wt),col="red",lwd=2,lty=1)lines函数可以向图像中添加曲线,例如数据的变化规律拟合曲线。
lines(lowess(mtcars$wt,mtcars$mpg),col="blue",lwd=2,lty=2)plotmeans
最后介绍一下gplots包的plotmeans函数,其特点是可以在绘制点线图的同时添加散点的误差棒。
plotmeans(formula, data=NULL, subset, na.action,
          bars=TRUE, p=0.95, minsd=0, minbar, maxbar,
          xlab=names(mf)[2], ylab=names(mf)[1], mean.labels=FALSE,
          ci.label=FALSE, n.label=TRUE, text.n.label="n=",
          digits=getOption("digits"), col="black", barwidth=1,
          barcol="blue", connect=TRUE, ccol=
          col, legends=names(means), xaxt, use.t=TRUE,
          lwd=par("lwd"), ...)各参数意义:
- formula为绘图的表达公式; 
- data为绘图数据; 
- subset定义是否只采用一部分数据进行绘图; 
- na.action定义当数据有含有NA时如何处理; 
- bars是否绘制置信区间; 
- p置信区间的置信水平,默认为0.95; 
- minsd允许的每组数据标准偏差最小值; 
- minbar和maxbar为允许的误差限的最小值和最大值; 
- xlab和ylab为x和y轴标签名称; 
- mean.labels定义代表平均数的圆形是否要被特定的文字标签替换; 
- ci.label是否在误差限的两端显示准确的数字; 
- n.label是否显示每组数据中观察值的个数; 
- text.n.label定义观察值个数的显示形式; 
- digits定义有效数字的个数; 
- col定义代表均值的圆形的颜色; 
- barwidth为误差棒的线长; 
- barcol为误差棒的颜色; 
- connect是否不同组的均值用一条线连接; 
- ccol定义连接线的颜色; 
- legends定义图例; 
- xaxt定义坐标轴的类型; 
- use.t计算置信区间是否应用t分布; 
- lwd连接线的线宽。 
默认条件下,plotmeans会根据数据的分组计算其组内平均值和95%置信区间,之后以空心原点表示组内平均值,蓝色的误差棒表示置信区间,并显示组内样本个数同时用线段连接各组的均值。
library(gplots)
data(state)
plotmeans(state.area ~ state.region)还可以自定义均值点的形状和各组间是否使用线段相连。
plotmeans(state.area ~ state.region, connect=list(1:2, 3:4),
            ccol="red", pch=7 )最后还有一个比较复杂的例子。
data(esoph)
  par(las=2,                        # use perpendicular axis labels
      mar=c(10.1,4.1,4.1,2.1),      # create enough space for long x labels
      mgp=c(8,1,0)                  # move x axis legend down to avoid overlap
      )
  plotmeans(ncases/ncontrols ~ interaction(agegp , alcgp, sep =" "),
            connect=list(1:6,7:12,13:18,19:24),
            barwidth=2,
            col="dark green",
            data=esoph,
            xlab="Age Group and Alcohol Consumption",
            ylab="# Cases / # Controls",
            main=c("Fraction of Cases for by Age and Alcohol Consumption",                   "Ile-et-Vilaine Esophageal Cancer Study")
            )
  abline(v=c(6.5, 12.5, 18.5), lty=2)