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)