我希望在我写的一篇文章中提出一个distance matrix,我正在为它寻找良好的可视化。
到目前为止,我遇到了气球图(我用它here,但我不认为它会在这种情况下起作用),热图(这里是a nice example,但它们不允许在表格中显示数字,如果我错了,请纠正我。可能是表格的一半,数字的一半会很酷)和最后的相关椭圆图(这里是some code and example - 使用形状很酷,但我不知道如何在这里使用它。)
还有各种聚类方法,但它们会聚合数据(不我想要的),而我想要的是呈现所有数据。
示例数据:
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist(nba[1:20, -1], )
我愿意接受想法。
答案 0 :(得分:20)
Voronoi图(Voronoi分解图)是一种可视化表示距离矩阵(DM)的方法。
使用R创建和绘图也很简单 - 你可以在一行R代码中完成这两项工作。
如果您不熟悉计算几何的这一方面,那么两者之间的关系(VD&amp; DM)很简单,但简短的总结可能会有所帮助。
距离矩阵 - 即显示点与每个其他点之间距离的二维矩阵,是kNN计算过程中的中间输出(即k近邻,一种预测给定数据值的机器学习算法)点基于其'k'最近邻居的加权平均值,距离方向,其中'k'是某个整数,通常在3到5之间。)
kNN在概念上非常简单 - 训练集中的每个数据点本质上都是某个n维空间中的“位置”,因此下一步是使用一定距离计算每个点与每个其他点之间的距离度量(例如,欧几里德,曼哈顿等)。虽然训练步骤 - 即构建距离矩阵 - 很简单,但使用它来预测新数据点的价值实际上受到数据检索的阻碍 - 从几千或几百万中找到最接近的3或4个点分散在n维空间中。
通常使用两种数据结构来解决该问题:kd-trees和Voroni分解(又名“Dirichlet tesselation”)。
Voronoi分解(VD)由距离矩阵唯一确定 - 即,存在1:1的映射;所以它确实是距离矩阵的直观表示,尽管这也不是它们的目的 - 它们的主要目的是有效存储用于基于kNN的预测的数据。
除此之外,以这种方式表示距离矩阵是否一个好主意可能最重要的取决于你的观众。对于大多数人来说,VD与先行距离矩阵之间的关系并不直观。但这并不是错误的 - 如果没有任何统计训练的人想知道两个人群是否有相似的概率分布并且你向他们展示了Q-Q情节,他们可能会认为你没有参与他们的问题。因此,对于那些知道他们正在看什么的人来说,VD是一个紧凑,完整和准确的DM表示。
那你怎么做一个?
通过从训练集内选择(通常是随机的)点子集来构造Voronoi分解(这个数字因环境而异,但如果我们有1,000,000个点,则100对于该子集是合理的数字)。这100个数据点是Voronoi中心(“VC”)。
Voronoi分解背后的基本思想是,不必筛选1,000,000个数据点来找到最近的邻居,你只需要查看这些100,然后一旦找到最近的VC,就会搜索到实际的最近邻居仅限于该Voronoi单元内的点。接下来,对于训练集中的每个数据点,计算它最接近的VC。最后,对于每个VC及其相关点,计算凸包 - 概念上,只计算由VC最远离VC的指定点形成的外边界。 Voronoi中心周围的这个凸包形成了一个“Voronoi单元”。完整的VD是将这三个步骤应用于训练集中的每个VC的结果。这将为您提供完美的曲面细分(参见下图)。
要计算R中的VD,请使用 tripack 包。关键功能是'voronoi.mosaic',你只需要分别传递x和y坐标 - 原始数据,不 DM - 然后你可以将voronoi.mosaic传递给'plot ”。
library(tripack)
plot(voronoi.mosaic(runif(100), runif(100), duplicate="remove"))
答案 1 :(得分:19)
Tal,这是一种在热图上重叠文本的快捷方法。请注意,这取决于image
而不是heatmap
,因为后者抵消了绘图,使得将文本放在正确的位置变得更加困难。
老实说,我认为这个图表显示的信息太多,使得阅读有点困难......你可能只想写特定的值。
另外,另一个更快的选择是将图表保存为pdf,将其导入Inkscape(或类似软件)并手动添加需要的文本。
希望这有帮助
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dst <- dist(nba[1:20, -1],)
dst <- data.matrix(dst)
dim <- ncol(dst)
image(1:dim, 1:dim, dst, axes = FALSE, xlab="", ylab="")
axis(1, 1:dim, nba[1:20,1], cex.axis = 0.5, las=3)
axis(2, 1:dim, nba[1:20,1], cex.axis = 0.5, las=1)
text(expand.grid(1:dim, 1:dim), sprintf("%0.1f", dst), cex=0.6)
答案 2 :(得分:19)
您还可以使用力导向图绘制算法来显示距离矩阵,例如
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist_m <- as.matrix(dist(nba[1:20, -1]))
dist_mi <- 1/dist_m # one over, as qgraph takes similarity matrices as input
library(qgraph)
jpeg('example_forcedraw.jpg', width=1000, height=1000, unit='px')
qgraph(dist_mi, layout='spring', vsize=3)
dev.off()
答案 3 :(得分:15)
您可能需要考虑查看矩阵的二维投影(多维缩放)。 Here is a link to how to do it in R
否则,我认为你使用热图是正确的。您可以毫不费力地添加数字。例如,建立关闭Learn R:
library(ggplot2)
library(plyr)
library(arm)
library(reshape2)
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba$Name <- with(nba, reorder(Name, PTS))
nba.m <- melt(nba)
nba.m <- ddply(nba.m, .(variable), transform,
rescale = rescale(value))
(p <- ggplot(nba.m, aes(variable, Name)) + geom_tile(aes(fill = rescale),
colour = "white") + scale_fill_gradient(low = "white",
high = "steelblue")+geom_text(aes(label=round(rescale,1))))
答案 4 :(得分:9)
基于层次聚类分析的树形图可能很有用: http://www.statmethods.net/advstats/cluster.html
R中的二维或三维多维尺度分析: http://www.statmethods.net/advstats/mds.html
如果你想进入3个维度,你可能想要探索ggobi / rggobi: http://www.ggobi.org/rggobi/
答案 5 :(得分:7)
Borcard等人的“数字生态学”一书。 2011年他们使用了一个名为* coldiss.r *的函数 你可以在这里找到它:http://ichthyology.usm.edu/courses/multivariate/coldiss.R
它对距离进行颜色编码,甚至通过不相似性对记录进行排序。
另一个好的包是系列化包。
参考: Borcard,D.,Gillet,F。&amp; Legendre,P。(2011)数字生态与R. Springer。
答案 6 :(得分:3)