减少高维数据以进行可视化的方法

机器算法验证 时间序列 数据可视化 时空
2022-02-02 06:55:04

我正在研究 2D 物理模拟,并且我正在几个时间点及时收集数据。这些离散点沿着垂直线,在轴向上有多条线。这使得数据集有效地 4D。

例如,假设我在 (X,Y) 坐标处有收集点:

  • (0,0), (1,0), (2,0)
  • (0,1), (1,1), (2,1)
  • (0,2), (1,2), (2,2)

在我收集的每一点{,,ü,}在哪里是压力,是温度,ü,是速度的 X 和 Y 分量。在模拟的每次迭代中,这些变量都存储在所有 9 个收集点中。所以我所有的数据在空间的每个离散点上都是时间连续的。

例如,单个点的数据如下所示:

压力与时间的单点 单点的 U 速度与时间

我有兴趣在所有时间显示所有点的压力以显示垂直波和轴向波。如果我要沿着一条线(垂直或轴向)执行此操作,我可以使用带有轴(Y、时间、压力)的瀑布图。但是,如果我有 3 条垂直线和 3 条轴线,这将是 6 个瀑布图,以获得双向波动的完整画面。空间坐标是离散变量,而场(在本例中为压力)和时间是连续的。

例如,在上图中,大压力峰值在0.000125可能在 X 或 Y 方向上移动。

有没有一种方法可以一次显示它们?通常可以添加颜色以使“第四”维度可见,但是还有另一种可能的方法吗?我计划尽可能多地绘制它,看看是否有任何东西揭示了其他人没有的信息,所以请提出任何想法。

如果模拟是 3D 并且我有一个 5D 结果数据集怎么办?这会改变可能的可视化方法吗?

4个回答

我自己有一些七维数据。尽管我最终选择了一小部分 3 维切片,但一个选项是Parallel Coordinates Plot这适用于任意数量的维度!来自维基百科:

平行坐标是可视化高维几何和分析多变量数据的常用方法。

为了显示 n 维空间中的一组点,绘制了由 n 条平行线组成的背景,通常是垂直且等距的。n 维空间中的一个点表示为一条折线,其顶点位于平行轴上;顶点在第 i 个轴上的位置对应于该点的第 i 个坐标。

在此处输入图像描述

Pairs plots:这不是一种降维方法,但它是快速了解一些有意义的关系可能存在的位置的一种非常好的方法。在 R 中,基本包包含pairs()函数,这对连续数据很有用(它将所有内容转换为连续数据)。更好的功能是ggpairs(),来自GGally包:

library(GGally)
ggpairs(iris, colour='Species')

虹膜对图

在大多数情况下,主成分分析通常是降维的好选择,我不确定它是否适合您的特定问题,但它会找到正交维度,沿着该正交维度捕获大多数数据样本的变化。如果您在 R 中开发,您可以使用prcomp()简单地将原始数据点矩阵转换为 PCA 形式。

以下是使用 ggplot2 描绘 3-D 数据的几种方法。您可以组合方法(平面网格、颜色、形状等)来增加图形的维度。

doInstall <- TRUE  # Change to FALSE if you don't want packages installed.
toInstall <- c("ggplot2")
if(doInstall){install.packages(toInstall, repos = "http://cran.r-project.org")}
lapply(toInstall, library, character.only = TRUE)

# Air passenger data. ts converted to long matrix:
myData <- data.frame(Year = c(floor(time(AirPassengers) + .01)),
                     Month = c(cycle(AirPassengers)), 
                     Value = c(AirPassengers))
# Easy conversion code from: http://stackoverflow.com/a/4973859/479554

# Convert month numbers to names, using a built-in constant:
myData$Month <- factor(myData$Month)
levels(myData$Month) <- month.abb

# One possibility:
zp1 <- ggplot(myData,
              aes(x = Year, y = Value, colour = Month))
zp1 <- zp1 + geom_line()
print(zp1)  # This is fine, if you can differentiate between the colors

# Another possibility:
zp2 <- ggplot(myData,
              aes(x = Year, y = Value))
zp2 <- zp2 + geom_line()
zp2 <- zp2 + facet_wrap(~ Month)
print(zp2)  # This is fine, but it's hard to compare across facets

# A third possibility; plotting reference lines across each facet:
referenceLines <- myData  # \/ Rename
colnames(referenceLines)[2] <- "groupVar"
zp3 <- ggplot(myData,
              aes(x = Year, y = Value))
zp3 <- zp3 + geom_line(data = referenceLines,  # Plotting the "underlayer"
                       aes(x = Year, y = Value, group = groupVar),
                       colour = "GRAY", alpha = 1/2, size = 1/2)
zp3 <- zp3 + geom_line(size = 1)  # Drawing the "overlayer"
zp3 <- zp3 + facet_wrap(~ Month)
zp3 <- zp3 + theme_bw()
print(zp3)

在此处输入图像描述