vlambda博客
学习文章列表

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")

R语言 | 折线图和趋势线拟合

绘制一个点线图。

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)))

R语言 | 折线图和趋势线拟合

修改图中点的形状并填充颜色。

matplot(sines, type = "b", pch = 21:23, col = 2:5, bg = 2:5,
main = "matplot(...., pch = 21:23, bg = 2:5)")

R语言 | 折线图和趋势线拟合

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)

R语言 | 折线图和趋势线拟合

lines函数可以向图像中添加曲线,例如数据的变化规律拟合曲线。

lines(lowess(mtcars$wt,mtcars$mpg),col="blue",lwd=2,lty=2)

R语言 | 折线图和趋势线拟合

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)

R语言 | 折线图和趋势线拟合

还可以自定义均值点的形状和各组间是否使用线段相连。

plotmeans(state.area ~ state.region, connect=list(1:2, 3:4),
ccol="red", pch=7 )

R语言 | 折线图和趋势线拟合

最后还有一个比较复杂的例子。


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)



我就知道你在看