R绘图笔记 | 一般的散点图绘制

2020-11-03 11:31:26 浏览数 (1)

可先阅读文章:R绘图笔记 | R语言绘图系统与常见绘图函数及参数

1.利用plot()绘制散点图

R语言中plot()函数的基本格式如下:

代码语言:javascript复制
plot(x,y,...)

plot函数中,x和y分别表示所绘图形的横坐标和纵坐标;函数中的...为附加的参数。plot函数默认的使用格式如下:

代码语言:javascript复制
plot(x, y = NULL, type = "p", xlim = NULL, ylim = NULL, log = "", main = NULL, sub = NULL, xlab = NULL, ylab = NULL, ann = par("ann"), axes = TRUE, frame.plot = axes, panel.first = NULL, panel.last = NULL, asp = NA, ...)

主要参数的含义如下:

(1)type为一个字符的字符串,用于给定绘图的类型,可选的值如下:

  • "p":绘点(默认值);
  • "l":绘制线;
  • "b":同时绘制点和线;
  • "c":仅绘制参数"b"所示的线;
  • "o":同时绘制点和线,且线穿过点;
  • "h":绘制出点到横坐标轴的垂直线;
  • "s":绘制出阶梯图(先横后纵);
  • "S":绘制出阶梯图(先纵后竖);
  • "n":作空图。

(2)main参数 字符串,给出图形的标题;

(3)sub参数 字符串,给出图形的子标题;

(4)xlab 和 ylab参数 字符串,用于给出x轴和y轴的标签。

(5)xlim 和 ylim参数 都是二维向量,分别表示x轴和y轴的取值范围。

(6)pch参数。

绘制第一个散点图

代码语言:javascript复制
####第一个图
x <- runif(50,0,2)
y <- runif(50,0,2)
plot(x, y, main="我的第一个散点图", sub="subtitle", 
     xlab="横坐标", ylab="纵坐标", pch=16)

添加文本和线

代码语言:javascript复制
text(0.6,0.6,"(0.6,0.6)")
abline(h=.6,v=.6, col='red')

第二个散点图

代码语言:javascript复制
####第二个图
x <- runif(50,0,2)
y <- runif(50,0,2)

plot(x, y, type="n", xlab="", ylab="", axes=F) 
points(x,y) #添加坐标点
axis(1) #添加横轴
axis(at=seq(0,2,0.5), side=2) #添加纵轴
box() #补齐散点图的边框
title(main="散点图", sub="subtitle", xlab="x轴", ylab="y轴")
abline(h=0.6,v=0.6,col="red")

2.利用ggpolt2绘图

代码语言:javascript复制
data(trees) # 加载数据集
head(trees) # 预览数据集

绘图

代码语言:javascript复制
ggplot(trees, aes(x=Girth,y=Height))  
  geom_point()
代码语言:javascript复制
ggplot(trees, aes(x=Girth,y=Height))  
  geom_point(alpha=0.5)
代码语言:javascript复制
ggplot(trees, aes(x=Girth,y=Height))  
  stat_bin2d()
代码语言:javascript复制
ggplot(trees, aes(x=Girth,y=Height))  
  stat_bin2d(bins=50)  
  scale_fill_gradient(low="lightblue", high="red" ,limits=c(0,5))

高级绘图

代码语言:javascript复制
ggplot(data = trees, aes(Girth,Volume))  
  geom_point(fill="black",colour="black",size=3,shape=21)  
  geom_smooth(method = 'loess',span=0.4,se=TRUE,colour="#00A5FF",fill="#00A5FF",alpha=0.2)  #(f)
  scale_y_continuous(breaks = seq(0, 125, 25)) 
  theme(
    text=element_text(size=15,color="black"),
    plot.title=element_text(size=15,family="myfont",hjust=.5,color="black"),
    legend.position="none"
  )

geom_smooth()函数提供了平滑算法,基本能够满足平时实验数据处理的要求。

添加数据拟合线性模型绘图

代码语言:javascript复制
fit <- lm(Volume ~ Girth, data = trees) #线性拟合
trees$predicted <- predict(fit)   # 保存预测值
trees$residuals <- residuals(fit) # 保存残差(有正有负)
trees$Abs_Residuals<-abs(trees$residuals)  #保存残差的绝对值

ggplot(trees, aes(x = Girth, y = Volume))  
  geom_point(aes(fill =Abs_Residuals, size = Abs_Residuals),shape=21,colour="black")   # size also mapped
  #使用实际的值绘制气泡图,并将气泡的颜色和面积映射到残差的绝对值
  scale_fill_continuous(low = "black", high = "blue")   #填充颜色映射到蓝色单色渐变系
  geom_smooth(method = "lm", se = FALSE, color = "lightgrey")  
  #添加灰色的线性拟合模型
  geom_point(aes(y = predicted), shape = 1)   #添加空心圆圈的预测值
  geom_segment(aes(xend = Girth, yend = predicted), alpha = .2)   #添加实际值与预测值之间的连线
  guides(fill = guide_legend((title="Rresidual")),
         size = guide_legend((title="Rresidual"))) 
  ylim(c(0,80)) 
  xlab("Girth") 
  ylab("Volume") 
  theme(text=element_text(size=15,face="plain",color="black"),
        axis.title=element_text(size=10,face="plain",color="black"),
        axis.text = element_text(size=10,face="plain",color="black"),
        legend.position = "right",
        legend.title  = element_text(size=13,face="plain",color="black"),
        legend.text = element_text(size=10,face="plain",color="black"),
        legend.background = element_rect(fill=alpha("white",0)))

3.其他散点图函数

除了上面的包和函数可以绘制散点图外,还有一些包也可以绘制复杂性的散点图。比如说car包中的scatterplot()函数和lattice包的xyplot()函数。car包中的scatterplot()函数增强了散点图的许多功能,它可以很方便地绘制散点图,并能添加拟合曲线、边界箱线图和置信椭圆,还可以按子集绘图和交互式地识别点。

代码语言:javascript复制
# 函数1:
scatterplot(formula, data, subset, xlab, ylab, id=FALSE,
    legend=TRUE, ...)
# 函数2:    
scatterplot(x, y, boxplots=if (by.groups) "" else "xy",
            regLine=TRUE, legend=TRUE, id=FALSE, ellipse=FALSE, grid=TRUE,
            smooth=TRUE,
            groups, by.groups=!missing(groups),
            xlab=deparse(substitute(x)), ylab=deparse(substitute(y)),
            log="", jitter=list(), cex=par("cex"),
            col=carPalette()[-1], pch=1:n.groups,
            reset.par=TRUE, ...)

重要参数:

代码语言:javascript复制
formula # 模型公式;类似y~x,如果按组绘制,则类似y~x|z,其中z为分组变量;
data # 为模型公式中变量来源的数据集;
subset # 指定筛选数据子集;
x, y # 分别表示水平(x轴)和垂直(y轴)坐标的数字向量;
boxplots # 如为x,则在下方绘制水平x轴的边界箱线图;如为y,则在左边绘制垂直y轴的边界箱线图;
# 如为xy,则在水平和垂直轴上都绘制边界箱线图;设置""或FALSE则不绘制边界箱线图;
regLine # 默认添加拟合回归线;如为FALSE,则不添加;
# 指定lm()函数拟合回归线,默认参数为regLine=list(method=lm, lty=1, lwd=2, col=col)
legend # 逻辑词,当按组绘制散点图且为TRUE时图上显示图例;为FALSE则不绘制图例;
grid # 逻辑词,为TRUE则绘制浅灰色背景网格;
groups # 分组变量或因子;使用不同的颜色、绘图符号等来绘制分组图形;
by.groups # 为TRUE,则按分组拟合回归线;
xlab、ylab # x轴和y轴标签;
log # 绘制对数坐标轴;
jitter # 包含x、y或两者都有的列表;指定散点图中点的水平和垂直坐标的抖动因子;
cex # 设置绘图字符的大小,默认为1;
# 其他参数为cex.axis、cex.lab、cex.main和cex.sub等;
col # 未分组时,直接指定绘制颜色;分组时,设置参数长度应等于组数的颜色向量;
pch # 点的绘图符号;分组时默认按顺序使用字符;
代码语言:javascript复制
library(car)
scatterplot(Volume ~ Girth, data = trees, 
            xlab="Girth", ylab="Volume",smooth=FALSE)

下面是帮助文档的案例。

代码语言:javascript复制
scatterplot(prestige ~ income, data=Prestige, ellipse=TRUE)
scatterplot(prestige ~ income, data=Prestige, smooth=list(smoother=quantregLine))
# use quantile regression for median and quartile fits
scatterplot(prestige ~ income | type, data=Prestige,
            smooth=list(smoother=quantregLine, var=TRUE, span=1, lwd=4, lwd.var=2))
scatterplot(prestige ~ income | type, data=Prestige, legend=list(coords="topleft"))
scatterplot(vocabulary ~ education, jitter=list(x=1, y=1),
            data=Vocab, smooth=FALSE, lwd=3)
scatterplot(infantMortality ~ ppgdp, log="xy", data=UN, id=list(n=5))
scatterplot(income ~ type, data=Prestige)

另外,还有ggpubr包中的ggscatter()函数也可以绘制散点图。

代码语言:javascript复制
library(ggpubr)
data(mtcars)
dat <- mtcars
dat$cyl <- as.factor(dat$cyl)
head(dat[, c("wt", "mpg", "cyl")], 3)
ggscatter(dat, x = "wt", y = "mpg",
          color = "cyl", shape = "cyl",
          palette = c("#00AFBB", "#E7B800", "#FC4E07"),
          ellipse = TRUE, mean.point = TRUE,
          star.plot = TRUE)
代码语言:javascript复制
## 部分参数解释
data, x, y # data指数据框,x、y为数据框中用来绘制图形的变量
combine # 逻辑词,默认FALSE,仅当y是包含多个变量的向量时使用;如为TRUE,则创建组合面板图
merge # 逻辑词或字符;默认FALSE,仅当y是包含多个变量的向量时使用;如为TRUE,则在同一绘图区域合并多个y变量;
# 字符为"asis"或"flip",如为"flip",则y变量翻转为x轴刻度,x变量翻转为分组变量
color、fill # 设置点的颜色
palette # 设置线图颜色的调色板;可为灰色调色板"grey";自定义调色板c("blue","red")
# ggsci包调色板:"npg","aaas","lancet","jco","ucscgb","uchicago","simpsons"和"rickandmorty"。
shape # 点的形状
size  # 数值,设置点和轮廓的大小
point  # 逻辑词,为TRUE,则在图上显示点
rug # 逻辑词,为TRUE,则显示边缘地毯
title # 图形标题
xlab、ylab  # 指定x轴、y轴的标签;当xlab = FALSE时隐藏标签,y轴同
facet.by  # 长度为1-2的字符向量,指定绘制分面的分组向量,分组向量应在数据框中
panel.labs  # 修改面板标签的字符向量的列表;用法:
# 一个分组向量:panel.labs = list(sex = c("Male", "Female")) 
# 两个分组向量:panel.labs = list(sex = c("Male", "Female"),rx = c("Obs","Lev","Lev2")).
short.panel.labs # 逻辑词,默认为TRUE,省略变量名称为面板创建简短标签
add  # 添加另一个绘图元素的字符向量;
# 如"none", "dotplot", "jitter", "boxplot", "point", 
# "mean", "mean_se", "mean_sd", "mean_ci", "mean_range", 
# "median", "median_iqr", "median_hilow", "median_q1q3", 
# "median_mad", "median_range"
add.params  # 参数add的参数(color, shape, size, fill, linetype),
# 用法add.params = list(color = "red").
conf.int # 逻辑词,为TRUE,则增加置信区间
conf.int.level # 设置置信区间的置信水平,默认95%
fullrange # 仅在add!="none"时使用,拟合是跨越图的整个范围还是只跨越数据?
ellipse # 逻辑词,为TRUE,则在点周围绘制椭圆
ellipse.level # 点周围椭圆的大小,默认0.95
ellipse.type # 使用字符来指定框的类型,允许值有"convex", "confidence"、"t"、"norm"、"euclid"等
ellipse.alpha # 椭圆的透明度,用于指定填充颜色的透明度,无填充颜色,设置为0。
ellipse.border.remove # 逻辑词,为TRUE,则删除椭圆边框线
mean.point # 逻辑词,为TRUE,则将分组平均点添加到绘图中
mean.point.size # 指定平均点大小的数值
star.plot # 逻辑词,为TRUE,则生成星图
star.plot.lty、star.plot.lwd # 星图的线型和线宽
label # 包含点标签的列的名称,也可以是长度=nrow(data)的向量
font.label # 包含下列元素的列表:大小、类型、颜色等;用法:
# font.label = list(size = 14, face = "bold", color ="red")
font.family # 指定标签的字体格式
label.select # 字符向量,指定要显示的一些标签;
repel # 逻辑词,是否使用ggrepel避免过度绘制文本标签。
label.rectangle # 逻辑词,如为TRUE,则在文本下方添加矩形便于阅读
parse # 为TRUE,标签将被解析为表达式
cor.coef # 逻辑词,为TRUE,相关系数的p值添加到图上
cor.coeff.args # 一系列参数传递给stat_cor函数,用来自定义相关系数的显示,用法:
# cor.coeff.args = list(method = "pearson", label.x.npc = "right", label.y.npc = "top").
cor.method # 计算相关系数的方法,可用值:"pearson", "kendall"或"spearman".
cor.coef.coord # 长度为2的数字向量,指定相关系数的x、y坐标,默认值为NULL
cor.coef.size # 相关系数文字字体的大小
ggp # 不为NULL,则将点添加到现有绘图中
show.legend.text # 逻辑词,图例中是否包含文字;
ggtheme # ggplot2主题名称,默认为theme_pubr();
# 可用值包括theme_gray(),theme_bw(),theme_minimal(),theme_classic(),theme_void()...

参考资料:

1.R语言数据可视化之美,张杰/著

2.scatterplot()函数帮助文件

3.ggscatter()函数帮助文件

0 人点赞