专栏首页庄闪闪的R语言手册R可视乎 | 散点图系列(1)

R可视乎 | 散点图系列(1)

1.前言

散点图(scatter graph、point graph、X-Y plot、scatter chart )是科研绘图中最常见的图表类型之一,通常用于显示和比较数值。散点图是使用一系列的散点在直角坐标系中展示变量的数值分布。在二维散点图中,可以通过观察两个变量的数据变化,发现两者的关系与相关性。

散点图可以提供三类关键信息:

(1)变量之间是否存在数量关联趋势;

(2)如果存在关联趋势,那么其是线性还是非线性的;

(3)观察是否有存在离群值,从而分析这些离群值对建模分析的影响。


本文可以看作是《R语言数据可视化之美》[1]的学习笔记。该书第四章——数据关系型图表中展示的散点图系列包括以下四个方面:

  1. 趋势显示的二维散点图
  2. 分布显示的二维散点图
  3. 气泡图
  4. 三维散点图

本文主要对第一部分进行介绍,并加上小编自己的理解。下面几个部分也会在这星期陆续推出,敬请关注。

2.本文框架

2.数据介绍

随机产生2列20行的数据,列名分别为x,y。x为序号,y由标准正态分布中产生。

library(ggplot2)
mydata = data.frame('x'= 1:20,'y'=sort(rnorm(20)))

3. 不同类型拟合曲线的绘制

3.1 loess数据平滑曲线

局部加权回归(Locally Weighted Scatterplot Smoothing,LOESS)主要思想是取一定比例的局部数据,在这部分子集中拟合多项式回归曲线,这样就可以观察到数据在局部展现出来的规律和趋势。曲线的光滑程度与选取数据比例有关:比例越少,拟合越不光滑,反之越光滑。

ggplot2绘制时,使用geom_point绘制散点图,geom_smooth加入拟合曲线,method选择为loess,se=TRUE表示加入置信带,span控制loess平滑的平滑量,较小的数字产生波动线,较大的数字产生平滑线。其他参数对颜色,填充色以及透明度进行了修改。

ggplot(data = mydata, aes(x,y)) +
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)

3.2 样条数据平滑曲线

这里使用了splines包中的样条函数,df=5,样条具有五个基函数,其他参数变化不大。具体非线性模型相关资料可参考:R语言里的非线性模型:多项式回归、局部样条、平滑样条、广义加性模型分析[2]

ggplot(data = mydata, aes(x,y)) +
geom_point(fill="black",colour="black",size=3,shape=21) +
geom_smooth(method="lm",se=TRUE,
formula=y ~ splines::bs(x, 5),colour="red")

3.3 GAM 数据平滑曲线

GAM 模型的拟合是通过一个迭代过程(向后拟合算法)对每个预测变量进行样条平滑的。其算法要在拟合误差和自由度之间进行权衡最终达到最优。

ggplot(data = mydata, aes(x,y)) +
geom_point(fill="black",colour="black",size=3,shape=21) +
geom_smooth(method = 'gam',formula=y ~s(x))

4. 残差分析图

残差分析(residual analysis)就是通过残差所提供 的信息,分析出数据的可靠性、周期性或其他干扰。用于分析模型的假定正确与否的方法。所谓残 差是指观测值与预测值(拟合值)之间的差,即实际观察值与回归估计值的差。以下给出两种拟合方法的残差分析图。注意: 这里还是使用前面随机模拟产生的数据。

4.1 线性拟合

通过lm函数进行回归分析,公式为

y = ax+b

。并将预测值

\hat{y}

,残差

\varepsilon

,残差的绝对值

|\varepsilon|

进行存储,结果如下所示。

fit <- lm(y ~ x, data = mydata)
mydata$predicted <- predict(fit) # Save the predicted values
mydata$residuals <- residuals(fit) # Save the residual values
mydata$Abs_Residuals <- abs(mydata$residuals)
head(mydata)

完整代码如下所示:

ggplot(mydata, aes(x = x, y = y)) +
  geom_point(aes(fill =Abs_Residuals, size = Abs_Residuals),shape=21,colour="black") + # size also mapped
  scale_fill_continuous(low = "black", high = "red") +
  geom_smooth(method = "lm", se = FALSE, color = "lightgrey") +
  geom_point(aes(y = predicted), shape = 1) +
  geom_segment(aes(xend = x, yend = predicted), alpha = .2) +
  guides(fill = guide_legend((title="Rresidual")),
         size = guide_legend((title="Rresidual")))+
  xlab("X-Axis")+
  ylab("Y-Axis")+
  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)))

代码详解

绘制的方式比较简单,根据ggplot的思想不断叠加图层。我们对以下代码进行详细分析:

  1. 以x为横坐标,y为纵坐标,geom_point()绘制散点图,以Abs_Residuals的大小来填充点和尺寸,颜色为黑色。scale_fill_continuous()将填充色从"black"到"red"渐变。geom_smooth()给数据加入拟合曲线,这里使用lm()方法,置信带不展示,颜色为"lightgrey"。这时候的图形如下:
  1. 将预测值的点进行绘制,geom_segment()可加入线段,其中xend = x, yend = predicted表示从x到x,y到predicted,所以就会产生下图中的竖直线了。
  1. 这时残差图基本完成,但是可以看到横纵坐标的标题有问题,右边的legend太累赘了以及字体颜色和大小还可以再做修改。最后图形如下所示:

4.2 非线性拟合

非线性拟合绘制残差图与线性拟合类似,唯一不同的点在:利用lm函数拟合不同的回归模型,以下使用了公式:

y = ax+bx^2+c

,后面的绘制与上面相同。

d<-mydata
fit <- lm(y ~ x+I(x^2), data = d)
d$predicted <- predict(fit)
d$residuals0 <- residuals(fit)
d$Residuals<-abs(d$residuals0 )
ggplot(d, aes(x = x, y = y)) +
geom_smooth(method = "lm",formula = y ~ x+I(x^2), se = FALSE, color = "lightgrey") +
geom_segment(aes(xend = x, yend = predicted), alpha = .2) +
geom_point(aes(fill =Residuals, size = Residuals),shape=21,colour="black") + # size also mapped
scale_fill_continuous(low = "black", high = "red") +
geom_point(aes(y = predicted), shape = 1) +
xlab("X-Axis")+ ylab("Y-Axis")+
geom_point(aes(y = predicted), shape = 1) +
guides(fill = guide_legend((title="Rresidual")),
size = guide_legend((title="Rresidual")))+
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)))

这两个图采用黑色到红色渐变颜色和气泡面积大小两个视觉暗示对应残差的绝对值大小,用于实际数据点的表示;而拟合数据点则用小空心圆圈表示,并放置在灰色的拟合曲线上。用直线连接实际数据点和拟合数据点。残差的绝对值越大,颜色越红、气泡也越大,连接直线越长,这样可以很清晰地观察数据的拟合效果。

4.3 有趣的拓展

R 中的ggimage[3]包提供了geom_image()函数可以将对应的圆形数据点使用图片替代展示。我们将其运用到上面的数据集中,就可以得到有趣的图了。

library(ggimage)
mydata$image = "https://www.r-project.org/logo/Rlogo.png"
ggplot(mydata, aes(x, y)) + geom_image(aes(image=image))+
  geom_smooth(method = 'lm')

参考资料

[1]

《R语言数据可视化之美》: https://github.com/EasyChart/Beautiful-Visualization-with-R

[2]

R语言里的非线性模型:多项式回归、局部样条、平滑样条、广义加性模型分析: http://tecdat.cn/r%e8%af%ad%e8%a8%80%e9%87%8c%e7%9a%84%e9%9d%9e%e7%ba%bf%e6%80%a7%e6%a8%a1%e5%9e%8b%ef%bc%9a%e5%a4%9a%e9%a1%b9%e5%bc%8f%e5%9b%9e%e5%bd%92%e3%80%81%e5%b1%80%e9%83%a8%e6%a0%b7%e6%9d%a1%e3%80%81%e5%b9%b3/

[3]

ggimage: https://cran.r-project.org/web/packages/ggimage/vignettes/ggimage.html

本文分享自微信公众号 - 庄闪闪的R语言手册(Zss_R4ds),作者:庄闪闪

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R可视乎 | 散点图系列(2)

    散点图(scatter graph、point graph、X-Y plot、scatter chart )是科研绘图中最常见的图表类型之一,通常用于显示和比较...

    庄闪闪
  • R可视乎|克利夫兰点图系列

    在可靠性实验中,不同产品的测试失效时间可以通过克利夫兰点图进行可视化,今天就对该系列的图进行系统的介绍。主要参考张杰博士的《R语言数据可视化之美》[1],并结合...

    庄闪闪
  • R可视乎|复合饼图系列

    散点复合饼图(compound scatter and pie chart)可以展示三个数据变量的信息:(x, y, P),其中x和y决定气泡在直角坐标系中的位...

    庄闪闪
  • Python 可视化 | 关联图 - 散点图1

    关联图是查找两个事物之间关系的图像,他能为我们展示出一个事物随着另一个事物的变化如何变化。

    咸鱼学Python
  • 数据可视化(2)-Seaborn系列 | 散点图scatterplot()

    案例代码已上传:https://github.com/Vambooo/SeabornCN

    数据分析可视化
  • R语言之可视化⑦easyGgplot2散点图目录

    ggplot2.stripchart是一个易于使用的函数(来自easyGgplot2包),使用ggplot2绘图系统和R软件生成条带图。 条形图也被称为一维散点...

    用户1359560
  • 动态地理信息可视化——散点地图系列

    这是一篇拖了好久的稿子,因为过年玩high了,一直放着没写,今天得空,赶快得空,赶紧整理一下。 本篇主讲leaflet在线地图系列中的散点系列,包含颜色映射规则...

    数据小磨坊
  • 数据可视化(8)-Seaborn系列 | 分类散点图stripplot()

    stripplot()可以自己实现对数据分类的展现,也可以作为盒形图或小提琴图的一种补充,用来显示所有结果以及基本分布情况。

    数据分析可视化
  • 数据可视化(9)-Seaborn系列 | 分簇散点图swarmplot()

    该函数类似于stripplot(),但该函数可以对点进行一些调整,使得数据点不重叠。

    数据分析可视化
  • R语言之可视化⑧easyGgplot2散点图续目录

    用户1359560
  • R语言可视化——散点图及其美化技巧!

    今天开始跟大家分享散点图及其美化技巧! R语言中的散点图需要两个数值型变量分别作为X轴、Y轴映射对象,同时通过颜色、大小、形状进行分类变量映射。 由于散点图在数...

    数据小磨坊
  • R语言可视化——地图填充与散点图图层叠加

    今天跟大家分享关于如何在地图图层上添加散点图。 散点图需要精确的经纬度信息才能在叠加的图层上进行映射,因此我们选用中国省级轮廓地图以及各省省会城市的经纬度进行案...

    数据小磨坊
  • R语言之可视化①③散点图+拟合曲线目录

    gene2) Pearson's product-moment correlation data: data gene1 and data$gene2 ...

    用户1359560
  • 数据可视化(1)-Seaborn系列 | 关系类图relplot()

    Seaborn是一个非常炫酷的python可视化库,它专攻于统计可视化。相较于matplotlib,它的语法更加简洁。

    数据分析可视化
  • 数据可视化(13)-Seaborn系列 | 点图pointplot()

    注:点图只显示平均值(或其他估计值)。但在许多情况下,显示每个分类变量级别的值分布可能更具信息性。此时,其他方法如一个盒子或小提琴可能更合适。

    数据分析可视化
  • Python可视化与basemap数据地图系列1

    最近在梳理Python中可以制作数据地图的可视化工具包,分别实践了geopandas、folium、Basemp,通过对比发现,静态地图中最为成熟的最终还得是B...

    数据小磨坊
  • 【独家】手把手教线性回归分析(附R语言实例)

    本文长度为8619字,建议阅读15分钟 本文为你介绍线性回归分析。 通常在现实应用中,我们需要去理解一个变量是如何被一些其他变量所决定的。 回答这样的问题,需要...

    数据派THU
  • 手把手教线性回归分析(附R语言实例)

    本文为你介绍线性回归分析。 通常在现实应用中,我们需要去理解一个变量是如何被一些其他变量所决定的。 回答这样的问题,需要我们去建立一个模型。一个模型就是一个公式...

    数据派THU
  • 《数据可视化基础》两个或多个连续性变量相关可视化(一)

    以下部分是基于《Fundamentals of Data Visualization》学习笔记,要是有兴趣的话,可以直接看原版书籍:https://serial...

    医学数据库百科

扫码关注云+社区

领取腾讯云代金券