R数据可视化|使用Scatterplot3d包制作3D散点图-程序员宅基地

技术标签: 3d  机器学习  r语言  

介绍

R 中有许多包(RGL、car、lattice、scatterplot3d等)用于创建3D 图形。

本教程介绍了如何使用 R 的 scatterplot3d包 在 3D 空间中生成散点图。

scaterplot3d 使用起来非常简单,可以通过在已经生成的图形中添加补充点或回归平面来轻松扩展。

它可以很容易地安装,因为它只需要一个已安装的 R 版本。
在这里插入图片描述

安装并加载 scaterplot3d

install.packages("scatterplot3d")
library("scatterplot3d")

准备数据

iris 数据集将被使用进行画图:

data(iris)
head(iris)

Iris 也称鸢尾花卉数据集,是一类多重变量分析的数据集。
数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性。
可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。

函数 scatterplot3d()

一个简化的格式是:

scatterplot3d(x, y=NULL, z=NULL)

x, y, z 是要绘制的点的坐标。参数 y 和 z 可以是可选的,具体取决于 x 的结构。

那么在什么情况下,y 和 z 是可选变量?

情况1: x是 zvar ~ xvar + yvar 类型的公式。xvar、yvar 和 zvar 用作 x、y 和 z 变量

情况2: x是一个矩阵,包含至少3列,分别对应于x、y和z变量

基本 3D 散点图

scatterplot3d(iris[,1:3])


# 改变点视图的角度
scatterplot3d(iris[,1:3], angle = 60)


更改主标题和轴标签

scatterplot3d(iris[,1:3],
              main="3D Scatter Plot",
              xlab = "Sepal Length (cm)",
              ylab = "Sepal Width (cm)",
              zlab = "Petal Length (cm)")


改变点的形状和颜色

可以使用参数 pchcolor

scatterplot3d(iris[,1:3], pch = 16, color="steelblue")


按组更改点形状

shapes = c(16, 17, 18) 
shapes <- shapes[as.numeric(iris$Species)]
scatterplot3d(iris[,1:3], pch = shapes)


按组更改点颜色

colors <- c("#32CD32", "#0000FF", "#FF4500")
colors <- colors[as.numeric(iris$Species)]
scatterplot3d(iris[,1:3], pch = 16, color=colors)


更改图形的全局外观

可以使用以下参数:

  • grid : 一个逻辑值。如果为 TRUE,则在底部绘制网格。
  • box : 一个逻辑值。如果为 TRUE,则在图片上方周围绘制一个框

删除周围的框

scatterplot3d(iris[,1:3], pch = 16, color = colors,
              grid=TRUE, box=FALSE)


  • x、y 和 z 是指定点的 x、y、z 坐标的数值向量。
    x 可以是一个矩阵或一个包含 3 列对应于 x、y 和 z 坐标的数据框。
    在这种情况下,参数 y 和 z 是可选的
  • grid 指定绘制网格的面。
    可能的值是“xy”、“xz”或“yz”的组合。 示例:grid = c(“xy”, “yz”)。
    默认值为 TRUE 以仅在 xy 平面上添加网格。
  • col.grid, lty.grid: 用于网格的颜色和线型

scatterplot3d 图形的不同面上添加网格:

# 1. 源函数
source('http://www.sthda.com/sthda/RDoc/functions/addgrids3d.r')
# 2. 3D散点图
scatterplot3d(iris[, 1:3], pch = 16, grid=FALSE, box=FALSE)
# 3. 添加网格
addgrids3d(iris[, 1:3], grid = c("xy", "xz", "yz"))


上图中有一个问题就是网格是在点上绘制的。

在下面的R代码中,我们将使用以下步骤将点放在前景中:

  1. 创建空的 scatterplot3 图形,并将 scatterplot3d() 的结果指定给 s3d
  2. 函数 addgrids3d() 用于添加网格
  3. 最后,函数 s3d$points3d 用于在三维散点图上添加点
# 1. 源函数
source('~/hubiC/Documents/R/function/addgrids3d.r')
# 2. 使用 pch="" 清空 3D 散点图
s3d <- scatterplot3d(iris[, 1:3], pch = "", grid=FALSE, box=FALSE)
# 3. 添加网格
addgrids3d(iris[, 1:3], grid = c("xy", "xz", "yz"))
# 4. 添加点
s3d$points3d(iris[, 1:3], pch = 16)


函数 points3d() 将在下一节中描述。

添加 bars

使用参数 type=“h”。这有助于非常清楚地查看点在 x-y 上的位置。

scatterplot3d(iris[,1:3], pch = 16, type="h", 
              color=colors)


修改 scatterplot3d 输出

scatterplot3d 返回一个函数闭包列表,可用于在现有绘图上添加元素。

返回的函数是:

  • xyz.convert(): 将 3D 坐标转换为现有 scatterplot3d 的 2D 平行投影。 它可用于向绘图中添加任意元素,例如图例。
  • points3d():在现有图中添加点或线
  • plane3d():将平面添加到现有绘图中
  • box3d():在图周围添加一个框

添加图例

使用 xyz.convert() 指定图例位置

  1. scatterplot3d() 的结果指定给 s3d
  2. 函数 s3d$xyz.convert() 用于指定图例的坐标
  3. 函数 legend() 用于添加图例
s3d <- scatterplot3d(iris[,1:3], pch = 16, color=colors)
legend(s3d$xyz.convert(7.5, 3, 4.5), legend = levels(iris$Species),
      col =  c("#32CD32", "#0000FF", "#FF4500"), pch = 16)


也可以使用以下关键字指定图例的位置:“bottomright”、“bottom”、“bottomleft”、“left”、“topleft”、“top”、“topright”、“right”和“center”

使用关键字指定图例位置

# 图例位置修改为 "right"
s3d <- scatterplot3d(iris[,1:3], pch = 16, color=colors)
legend("right", legend = levels(iris$Species),
      col =  c("#32CD32", "#0000FF", "#FF4500"), pch = 16)


# 使用参数 inset,其中inset设置值越大,图例越向左偏移

s3d <- scatterplot3d(iris[,1:3], pch = 16, color=colors)
legend("right", legend = levels(iris$Species),
  col = c("#32CD32", "#0000FF", "#FF4500"), pch = 16, inset = 0.1)


# 图例位置修改为 "bottom"
s3d <- scatterplot3d(iris[,1:3], pch = 16, color=colors)
legend("bottom", legend = levels(iris$Species),
      col = c("#32CD32", "#0000FF", "#FF4500"), pch = 16)


使用关键字来指定图例位置非常简单。但是,有时,某些点和图例框之间或轴和图例框之间存在重叠。

那么有什么解决方案可以避免这种重叠吗?

当然,对于函数 Legend(),有多种使用以下参数组合的解决方案

  • bty = “n” :删除图例周围的框。 在这种情况下,图例的背景颜色变得透明,重叠点变得可见
  • bg = “transparent” :将图例框的背景颜色更改为透明颜色(仅当 bty != “n” 时才有可能)
  • inset :修改图边距和图例框之间的距离
  • horiz :一个逻辑值; 如果为 TRUE,则水平而不是垂直设置图例
  • xpd :逻辑值; 如果为 TRUE,则它允许将图例项绘制在绘图之外

自定义图例位置

# 自定义点形状
s3d <- scatterplot3d(iris[,1:3], pch = shapes)
legend("bottom", legend = levels(iris$Species),
       pch = c(16, 17, 18), 
      inset = -0.25, xpd = TRUE, horiz = TRUE)


# 自定义颜色
colors <- c("#ADD8E6", "#FFA07A", "#8470FF")
colors <- colors[as.numeric(iris$Species)]
s3d <- scatterplot3d(iris[,1:3], pch = shapes, color=colors)
legend("bottom", legend = levels(iris$Species),
      col =  c("#ADD8E6", "#FFA07A", "#8470FF"), pch = 16, 
      inset = -0.25, xpd = TRUE, horiz = TRUE)


在上面的 R 代码中,可以使用参数 inset、xpd 和 horiz 来查看对图例框外观的影响。

添加点标签

函数 text() 的用法如下:

scatterplot3d(iris[,1:3], pch = 16, color=colors)
text(s3d$xyz.convert(iris[, 1:3]), labels = rownames(iris),
     cex= 0.7, col = "black")


添加回归平面和补充点

  1. scatterplot3d() 的结果赋值给 s3d
  2. 线性模型计算如下:lm(zvar ~ xvar + yvar)。 假设:zvar 取决于 xvar 和 yvar
  3. 函数 s3d$plane3d() 用于添加回归平面
  4. 使用函数 s3d$points3d() 添加补充点

将使用数据集:

data(trees)
head(trees)
# 该数据集提供了黑樱桃树的周长、高度和体积的测量值。

带有回归平面的 3D 散点图:

# 3D scatter plot
s3d <- scatterplot3d(trees, type = "h", color = "blue",
    angle=45, pch = 16)
# 添加回归平面
my.lm <- lm(trees$Volume ~ trees$Girth + trees$Height)
s3d$plane3d(my.lm)
# 添加补充点
s3d$points3d(seq(10, 20, 2), seq(85, 60, -5), seq(60, 10, -10),
    col = "red", type = "h", pch = 8)


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_49960764/article/details/122249790

智能推荐

【内功修炼】深入理解函数栈帧的创建和销毁-程序员宅基地

文章浏览阅读439次,点赞39次,收藏35次。详解函数栈帧的创建和销毁

MVC模式-程序员宅基地

文章浏览阅读6k次,点赞22次,收藏101次。一、MVC模式简介MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而得到更好的开发和维护效率。 在MVC模式中,应用程序被划分成了模型(Model)、视图(View)和控制器(Controller)三个部分。其中,模型部分包含了应用程序的业务逻辑和业务数据;视图部分封装了应用程序的输出形式,也就是通常所说的页_mvc模式

macOS下QT设置应用程序图标、程序坞图标_qt macos 软件图标-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏5次。1. 设置应用程序图标(finder中展示的图标)在Qt助手(QT Assistant)中,输入“setting”,可以看到下面的列表中有Setting the Application Icon,双击它就可以看到右侧窗口中的帮助文档,帮助文档里介绍了如何设置应用程序图标。文档内容很全面,包括如何设置windows、OS X和linux的程序图标。这里我们介绍如何设置macOS下应用程序的图标。如Qt助手中介绍的方法,QWindows::setWindowIcon()只能设置在程序坞中展示的图标,_qt macos 软件图标

手把手教你系列之微信公众号 java后端获取code(重定向解决)_微信授权后端重定向获取code可行么-程序员宅基地

文章浏览阅读8.4k次,点赞7次,收藏20次。微信开发文档上,获取code是在前端页面获取,但是现在也不知道为啥非得在后端获取,获取就获取吧,安排一下。获取code的目的,其实就是为了获取openid和token,获取openid和token的目的,其实是为了获取unionid和用户信息。先写个工具类,主要是两个方法,需要的,你们直接复制粘贴就好public class WxGzhUtils {/*** 获取openid access_token* @param appid* @param secret* @param code* _微信授权后端重定向获取code可行么

switch case 语句-程序员宅基地

文章浏览阅读131次。简单介绍了switch case,快来看看吧~

Unity Shader中内置的坐标空间与转换矩阵函数_unity空间转换函数-程序员宅基地

文章浏览阅读2.6k次。模型空间(model space)也称为对象空间(object space)或局部空间(local space)是指以模型原点为原点的坐标系。世界空间(world space)也称全局空间(global space)是以世界原点为原点的坐标系,世界坐标也就是Unity3D里的绝对坐标。观察空间(view space)也称摄像机空间(camera space)是以摄像机为原点的坐标系。(这是各坐标空..._unity空间转换函数

随便推点

IDEA下解决Maven依赖冲突_idea如何解决依赖冲突-程序员宅基地

文章浏览阅读891次。但是这个oss对象的依赖包的冲突解决了,但是会出现问题,由于那个common-lang是Apache的工具类,那个标签又不加version标签,如果去掉那里这里的2.3的版本和2.5的版本就都去掉了.显然是不合理的.不建议去掉这里的冲突.目前项目使用的版本号是2.5的.但是有2.3的依赖存在,导致发生了冲突,如果有许多的version的,也只会使用一个其他的就会标红表示发生了依赖冲突的.1.3 目前是发现了冲突所在的详细位置了,接下来就是解决冲突了.点击项目的pom.xml文件._idea如何解决依赖冲突

概率论基础复习题-程序员宅基地

文章浏览阅读912次,点赞13次,收藏11次。显著性水平从0.05降低到0.01,说明拒绝域也减小,在拒绝域大的情况下接受,那么在该拒绝域变小的情况下也定然接受。[3] 茆诗松, 周纪芗. 概率论与数理统计 (第三版). 中国统计出版社, 2007。[4] 陈家鼎等. 数理统计学讲义 (第二版). 高等教育出版社, 2006。[5] 王松桂等. 概率论与数理统计 (第三版). 科学出版社, 2011。[1] 陈希孺. 概率论与数理统计. 中国科学技术大学出版社, 2009。样本方差是总体方差的无偏估计。统计值是一个数值,统计量是一个随机变量。

使用BeanUtils.populate将map集合封装为bean对象_beanutils.populate(customer, map);-程序员宅基地

文章浏览阅读1.3k次。背景把jsp页面中表单的内容存到数据库,和request.getParameterMap配合使用可以将jsp页面表单的数据转化为bean对象。在对象参数比较多的情况下,使用request.getParameter比较麻烦BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下:完整方法:BeanUtils.populate( Object bean, Map properties ),这个方法会遍_beanutils.populate(customer, map);

站长常用的200个js代码-程序员宅基地

文章浏览阅读134次。站长常用的200个js代码1.文本框焦点问题onBlur:当失去输入焦点后产生该事件onFocus:当输入获得焦点后,产生该文件Onchange:当文字值改变时,产生该事件Onselect:当文字加亮后,产生该文件<input type="text" value="郭强" onfocus="if(value=='郭强') {value=''}" onb..._站长之家h5端站点统计js代码

springboot基于微信小程序的社区外卖系统--70047(免费领源码、附论文)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案-程序员宅基地

文章浏览阅读131次。社区外卖系统小程序主要功能模块包括推荐菜品、今日特惠、外卖咨询、配送信息、用户反馈,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用springboot框架、Java技术、Ajax技术进行业务系统的编码及其开发,实现了本系统的全部功能。

Java“牵手”易贝商品列表数据,关键词搜索易贝商品数据接口,易贝API申请指南-程序员宅基地

文章浏览阅读248次。ebayAPI接口入点(按图搜索,商品详情,关键词搜索,商品评论,订单类接口),希望以上的示例,可以帮到有需要的朋友。以上示例中,通过发送 HTTP /POST/GET 请求获取ebay商品列表和详情的 API 数据,然后将返回的 JSON 数据解析为对应的数据结构,以便进一步处理和使用。要获取ebay商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问ebay商城的网页来获取商品详情信息。调用开放平台提供的接口,传入商品 ID 作为参数,获取对应商品的列表和详情页面数据。

推荐文章

热门文章

相关标签