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


19

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

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

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

并且在每个点上我都收集,其中P是压力,T是温度,U V是速度的X分量和Y分量。在模拟的每次迭代中,将为所有9个收集点存储这些变量。因此,我所有的数据在空间的每个离散点上都是连续的。{PŤüV}PŤüV

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

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

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

Ť0.000125

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

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


所有尺寸都是离散的还是连续的?如果是这样,哪个是哪个?
naught101

(X,Y)是离散的,而(P,time)是连续的。
tpg2114

我建议考虑将刻面作为 3 d 的替代(或补充)
Michael Bishop

它是否需要是可以打印的静态图?如果没有,您可以将数据显示为一系列的时间图。如果我没记错的话,JMP软件会执行此类操作。
埃米尔·弗里德曼

1
@ naught101相应地更新。
tpg2114

Answers:


14

我自己有一些7维数据。尽管我最终选择了3维切片,但其中一个选项是“ 平行坐标图”。这适用于任意数量的尺寸!从维基百科:

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

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

在此处输入图片说明


那是一个很棒的情节。出色地使用色彩。图例在侧面会更好,并重新排序以匹配最后一个轴上的颜色,但这并不重要。
naught101

3
@ naught101它来自Wikipedia,请随时发送经过改进的代码;-)
gerrit 2012年

这是一个很棒的技术!
Sohaib I 2013年

4

成对绘制:这不是维的方法,但是它是快速了解某些有意义的关系可能在哪里的好方法。在R中,基本包包含该pairs()函数,该函数适用于连续数据(它将所有内容转换为连续数据)。更好的功能是ggpairs()GGally包中获取:

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

虹膜对图


3

在大多数情况下,主成分分析通常是减少尺寸的一个不错的选择,我不确定它是否适合您的特定问题,但是它将找到正交的维度,可以捕获大多数数据样本的变化。如果您使用R开发,则可以使用prcomp()来简单地将原始数据点矩阵转换为PCA表单。


2

这是用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)

在此处输入图片说明


那是相同的情节,重复了12次,但是突出显示了不同的线条,对吗?绝对是查看数据的一种有趣方式!另一种方法是仅绘制原始的每月时间序列,然后按月进行构面,然后在其之上绘制月份点。相同的想法,但其中包含“真实”时间序列。
naught101

像这样:APdf <- data.frame(Time=c(time(AirPassengers)), Year=c(floor(time(AirPassengers))), Month=c(cycle(AirPassengers)), Value=c(AirPassengers)) ; APdf$Month <- month.abb[APdf$Month] ; ggplot(APdf, aes(x=Time, y=Value)) + facet_wrap(facets='Month') + geom_line(data=APdf[,c(1,4)], colour='gray') + geom_point()。该死的,我爱ggplot2。
naught101

1

p=pË一种ñ在此处输入图片说明

该图显示了不同轴向位置的速度曲线,为您提供了流场的二维图。垂直线表示速度0。没有点的区域不是计算域的一部分。当然这不容易扩展到3D数据...


白方块是做什么用的?
naught101

这是流场表示。这是绕拐角的流动,剖面表示不同轴向位置的速度...
FrenchKheldar 2012年

好。在答案中添加一些描述会很有意义。情节本身是非常不透明的……
naught101
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.