我想在我写的文章中提出一个距离矩阵,我正在为它寻找良好的可视化.
到目前为止,我遇到了气球图(我在这里使用它,但我不认为它会在这种情况下起作用),热图(这是一个很好的例子,但它们不允许在表中显示数字,正确我,如果我错了.也许一半的颜色和一半的数字将是很酷的)和最后的相关椭圆图(这里是一些代码和示例 - 使用一个形状很酷,但我不知道如何使用它这里).
还有各种聚类方法,但它们会聚合数据(这不是我想要的),而我想要的是呈现所有数据.
示例数据:
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv") dist(nba[1:20, -1], )
我很开心.
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)
甲Voronoi图(维诺分解的曲线图)是一种方法,以在视觉上表示距离矩阵(DM).
它们也很容易使用R创建和绘图 - 你可以在一行R代码中完成.
如果你不熟悉计算几何的这一方面,那么两者之间的关系(VD和DM)是直截了当的,尽管简短的总结可能会有所帮助.
距离矩阵 - 即,显示点与每个其他点之间的距离的2D矩阵,是kNN计算期间的中间输出(即,k-最近邻,机器学习算法,其基于预测给定数据点的值)它的'k'最近邻居的加权平均值,距离方向,其中'k'是某个整数,通常在3到5之间.)
kNN在概念上非常简单 - 训练集中的每个数据点本质上都是某个n维空间中的"位置",因此下一步是使用一些距离度量来计算每个点与每个其他点之间的距离(例如, ,欧几里德,曼哈顿等).虽然训练步骤 - 即构建距离矩阵 - 很简单,但使用它来预测新数据点的价值实际上受到数据检索的阻碍 - 从几千或几百万中找到最接近的3或4个点分散在n维空间中.
通常使用两种数据结构来解决该问题:kd-trees和Voroni分解(又名"Dirichlet tesselation").
Voronoi分解(VD)由距离矩阵唯一确定 - 即,存在1:1的映射; 所以它确实是距离矩阵的直观表示,尽管这也不是它们的目的 - 它们的主要目的是有效存储用于基于kNN的预测的数据.
除此之外,以这种方式表示距离矩阵是否一个好主意可能最重要的取决于你的观众.对于大多数人来说,VD与先行距离矩阵之间的关系并不直观.但这并不是错误的 - 如果没有任何统计训练的人想知道两个人群是否有相似的概率分布并且你向他们展示了QQ情节,他们可能会认为你没有参与他们的问题.因此,对于那些知道他们正在看什么的人来说,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"))
您还可以使用力导向图绘制算法来可视化距离矩阵,例如
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', px') qgraph(dist_mi, layout='spring', vsize=3) dev.off()
您可能需要考虑查看矩阵的二维投影(多维缩放).以下是如何在R中执行此操作的链接.
否则,我认为你在热线图上走在正确的轨道上.您可以毫不费力地添加数字.例如,建立关闭学习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))))
基于层次聚类分析的树形图可能很有用:http: //www.statmethods.net/advstats/cluster.html
R中的二维或三维多维尺度分析:http: //www.statmethods.net/advstats/mds.html
如果你想进入3个维度,你可能想要探索ggobi/rggobi:http://www.ggobi.org/rggobi/
在Borcard等人的"数字生态学"一书中.2011年,他们使用了一个名为*coldiss.r*的函数,你可以在这里找到它:http://ichthyology.usm.edu/courses/multivariate/coldiss.R
它通过不同的颜色对距离进行编码,甚至对记录进行排序.
另一个很好的包装将是系列化包装.
参考文献:Borcard,D.,Gillet,F.&Legendre,P.(2011)Numerical Ecology with R. Springer.