作者:庄闪闪

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函数进行回归分析,公式为 。并将预测值 ,残差,残差的绝对值进行存储,结果如下所示。

fit mydata$predicted # Save the predicted valuesmydata$residuals # Save the residual valuesmydata$Abs_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函数拟合不同的回归模型,以下使用了公式:,后面的绘制与上面相同。

dfit 2), data = d)d$predicted d$residuals0 d$Residuals
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 mappedscale_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语言里的非线性模型:多项式回归、局部样条、平/

[3]

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

qt根据散点图拟合曲线_R可视化 | 散点图系列(1)相关推荐

  1. python界面散点图_Python数据可视化——散点图

    PS: 翻了翻草稿箱, 发现居然存了一篇去年2月的文章...虽然naive,还是发出来吧... 本文记录了python中的数据可视化--散点图scatter, 令x作为数据(50个点,每个30维),我 ...

  2. Python使用matplotlib可视化散点图、使用seaborn中的lmplot函数可视化不同分组散点图的最优线性回归拟合曲线(Scatter plot with regression line)

    Python使用matplotlib可视化散点图.使用seaborn中的lmplot函数可视化不同分组散点图的最优线性回归拟合曲线(Scatter plot with linear regressio ...

  3. R语言可视化散点图(scatter plot)、并在散点图中叠加回归曲线、叠加lowess拟合曲线(linear and lowess fit lines)、使用plot、line、abline函数

    R语言可视化散点图(scatter plot).并在散点图中叠加回归曲线.叠加lowess拟合曲线(linear and lowess fit lines).使用plot函数.line函数和ablin ...

  4. python散点图拟合曲线-python散点图拟合

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 下面是我在文本文件中绘制数据散点图的代码. 我打开的文件包含两列. 左列为x坐标 ...

  5. R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_circle函数在数据簇或数据分组的数据点周围添加圆圈进行注释(自定义圆圈的大小)

    R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_circle函数在数据簇或数据分组的数据点周围添加圆圈进行注释(自定义圆圈的大小) 目录

  6. R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息

    R语言ggplot2可视化散点图.可视化两个数值变量之间的关系(Scatter plot).使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线.自定义数据点的大小.色彩.添加 ...

  7. Python使用matplotlib可视化散点图、使用seaborn中的lmplot函数使用多子图可视化不同分组的散点图最优拟合线性回归曲线

    Python使用matplotlib可视化散点图.使用seaborn中的lmplot函数使用多子图可视化不同分组的散点图最优拟合线性回归曲线(Each regression line in its o ...

  8. R语言可视化散点图、气泡图、动态气泡图、数据点重合的散点图、数据点计数图、抖动数据点图、基于lm方法或者loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注

    R语言可视化散点图.气泡图.动态气泡图.数据点重合的散点图.数据点计数图.抖动数据点图.基于

  9. Python使用matplotlib可视化散点图、并在可视化图像的底部和右边添加边缘直方图、自定义边缘直方图的色彩(Marginal Histogram)

    Python使用matplotlib可视化散点图.并在可视化图像的底部和右边添加边缘直方图.自定义边缘直方图的色彩(Marginal Histogram) 目录

最新文章

  1. Python模块包中__init__.py文件的作用
  2. 小程序获取form_id 与 小程序获取openid
  3. 服务器find寻找文件路径,Linux find 查找文件
  4. PHP后门新玩法:一款猥琐的PHP后门分析
  5. [学习笔记]我们追过的神奇异或(Trie树系列)
  6. spring boot aop 记录方法执行时间
  7. 查询加索引oracle,指定索引/*+INDEX(TABLE INDEX_NAME)*/等优化Oracle查询效率的总结
  8. 50个经典jquery实例_【电气知识】从原理图到程序的4个经典实例详解
  9. Appium+python自动化(三十二)- 代码写死一时爽,框架重构火葬场 - PageObject+unittest(超详解)...
  10. 数据库内外联接查询语句
  11. my visitor
  12. 【渝粤教育】电大中专电子商务网站建设与维护 (29)作业 题库
  13. AUTOSAR ComM模块介绍
  14. 如何从excel的多行中随机选出n行
  15. java定义长方形类三个构造方法,《JAVA期末考.docx
  16. 波士顿动力机器人“体力不支”,搬箱子不成反摔倒
  17. GB2312的编码规则
  18. 人行二代征信企业表设计
  19. 如何提高小学生的写作能力
  20. IntelliJ IDEA 2020.3正式发布,年度最后一个版本很讲武德

热门文章

  1. arcgis server site 快速恢复与重建
  2. 第二十四章 异常和错误处理 1异常
  3. 小型ASP服务器|简洁asp服务器
  4. CEGUI、LayoutEdit和TextureAtlas
  5. oopc——8.经典案例1-rt thread
  6. flink1.12.2+hudi0.9.0测试
  7. .net实现批量在线打印_如何实现报表的批量打印需求
  8. jsp是在html里面嵌入哪种代码?_再说嵌入式入门
  9. MySQL访问行更新慢、用户线程大量堆积竟是因为它
  10. 一文带你全面了解java对象的序列化和反序列化