179

直方图和散点图是可视化数据和变量之间关系的好方法,但最近我一直想知道我缺少哪些可视化技术。你认为最未被充分利用的情节是什么?

答案应该:

  1. 在实践中不是很常用。
  2. 无需大量背景讨论即可理解。
  3. 适用于许多常见情况。
  4. 包括可重现的代码以创建示例(最好在 R 中)。链接的图像会很好。
4

15 回答 15

89

我真的同意其他海报:塔夫特的书很棒,值得一读。

首先,我会向您指出今年早些时候“查看数据”中关于 ggplot2 和 ggobi 的一个非常好的教程。除此之外,我只强调一个来自 R 的可视化和两个图形包(它们不像基础图形、格子或 ggplot 那样广泛使用):

热图

我真的很喜欢可以处理多变量数据的可视化,尤其是时间序列数据。 热图对此很有用。David Smith 在 Revolutions 博客上推荐了一款非常简洁的产品。这是 Hadley 提供的 ggplot 代码:

stock <- "MSFT"
start.date <- "2006-01-12"
end.date <- Sys.Date()
quote <- paste("http://ichart.finance.yahoo.com/table.csv?s=",
                stock, "&a=", substr(start.date,6,7),
                "&b=", substr(start.date, 9, 10),
                "&c=", substr(start.date, 1,4), 
                "&d=", substr(end.date,6,7),
                "&e=", substr(end.date, 9, 10),
                "&f=", substr(end.date, 1,4),
                "&g=d&ignore=.csv", sep="")    
stock.data <- read.csv(quote, as.is=TRUE)
stock.data <- transform(stock.data,
  week = as.POSIXlt(Date)$yday %/% 7 + 1,
  wday = as.POSIXlt(Date)$wday,
  year = as.POSIXlt(Date)$year + 1900)

library(ggplot2)
ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + 
  geom_tile(colour = "white") + 
  scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + 
  facet_wrap(~ year, ncol = 1)

最终看起来有点像这样:

替代文字

RGL:交互式 3D 图形

另一个值得努力学习的软件包是RGL,它可以轻松地提供创建交互式 3D 图形的能力。网上有很多例子(包括在 rgl 文档中)。

R-Wiki 有一个很好的例子,说明如何使用 rgl 绘制 3D 散点图。

戈壁

另一个值得了解的包是rggobi。有一本关于该主题的 Springer 书籍,以及许多很棒的在线文档/示例,包括“查看数据”课程。

于 2010-01-16T18:17:34.670 回答
58

我真的很喜欢点图,并且发现当我将它们推荐给其他人以解决适当的数据问题时,他们总是会感到惊讶和高兴。它们似乎没有多大用处,我不知道为什么。

这是来自 Quick-R 的示例: 汽车数据上的点图

我相信克利夫兰对这些的开发和颁布负有最大的责任,他书中的例子(其中有缺陷的数据很容易用点图检测到)是使用它们的有力论据。请注意,上面的示例每行仅放置一个点,而它们的真正威力来自每行上有多个点,并带有说明哪个是哪个的图例。例如,您可以为三个不同的时间点使用不同的符号或颜色,从而轻松了解不同类别的时间模式。

在下面的示例中(在 Excel 中完成所有事情!),您可以清楚地看到哪个类别可能遭受了标签交换的影响。

2组点图

于 2011-02-28T04:17:49.453 回答
56

使用极坐标的绘图肯定没有得到充分利用——有些人会说有充分的理由。我认为证明使用它们的情况并不常见。我还认为,当出现这些情况时,极坐标图可以揭示数据中的模式,而线性图则不能。

我认为这是因为有时您的数据本质上是极性的而不是线性的——例如,它是周期性的(x 坐标表示多天 24 小时内的时间),或者数据先前已映射到极性特征空间。

这是一个例子。此图按小时显示网站的平均流量。注意晚上 10 点和凌晨 1 点的两个峰值。对于站点的网络工程师来说,这些意义重大;它们彼此靠近(仅相隔两个小时)也很重要。但是,如果您在传统坐标系上绘制相同的数据,则该模式将完全隐藏——线性绘制,这两个尖峰将相隔20小时,尽管它们在连续几天中也仅相隔两个小时。上面的极坐标图以简洁和直观的方式显示了这一点(不需要图例)。

显示站点流量的极坐标图,峰值出现在 1 小时和 22 小时

有两种方法(我知道)使用 R 创建这样的图(我在上面用 R 创建了图)。一种是在基本或网格图形系统中编写您自己的函数。他们另一种更简单的方法是使用循环包。您将使用的功能是“ rose.diag ”:

data = c(35, 78, 34, 25, 21, 17, 22, 19, 25, 18, 25, 21, 16, 20, 26, 
                 19, 24, 18, 23, 25, 24, 25, 71, 27)
three_palettes = c(brewer.pal(12, "Set3"), brewer.pal(8, "Accent"), 
                   brewer.pal(9, "Set1"))
rose.diag(data, bins=24, main="Daily Site Traffic by Hour", col=three_palettes)
于 2010-01-18T00:19:25.147 回答
54

如果您的散点图有太多的点以至于变得一团糟,请尝试平滑散点图。这是一个例子:

library(mlbench) ## this package has a smiley function
n <- 1e5 ## number of points
p <- mlbench.smiley(n,sd1 = 0.4, sd2 = 0.4) ## make a smiley :-)
x <- p$x[,1]; y <- p$x[,2]
par(mfrow = c(1,2)) ## plot side by side
plot(x,y) ## left plot, regular scatter plot
smoothScatter(x,y) ## right plot, smoothed scatter plot

hexbin软件包(由@Dirk Eddelbuettel 建议)用于相同目的,但smoothScatter()具有属于该graphics软件包的优点,因此是标准 R 安装的一部分。

笑脸作为常规或平滑散点图

于 2011-08-15T12:56:25.693 回答
30

关于 sparkline 和其他 Tufte 想法,CRAN上的YaleToolkit包提供了函数和. sparklinesparklines

另一个对较大数据集有用的包是hexbin,因为它巧妙地将数据“分箱”到桶中,以处理对于幼稚散点图而言可能太大的数据集。

于 2010-01-16T17:30:50.873 回答
29

小提琴图(将箱线图与核密度相结合)比较奇特而且很酷。R 中的vioplot包使您可以很容易地制作它们。

这是一个示例(维基百科链接也显示了一个示例):

在此处输入图像描述

于 2011-11-03T03:22:43.913 回答
25

我刚刚回顾的另一个不错的时间序列可视化是“凹凸图”(如“Learning R”博客上的这篇文章中所介绍的)。这对于可视化位置随时间的变化非常有用。

您可以在http://learnr.wordpress.com/上阅读有关如何创建它的信息,但这就是它最终的样子:

替代文字

于 2010-01-20T21:45:35.733 回答
21

我也喜欢 Tufte 对箱线图的修改,它可以让您更轻松地进行小倍数比较,因为它们在水平方向上非常“薄”,并且不会用多余的墨水弄乱图。但是,它最适用于相当多的类别;如果你在一个情节上只有几个,那么常规(Tukey)箱线图看起来会更好,因为它们对它们有更多的分量。

library(lattice)
library(taRifx)
compareplot(~weight | Diet * Time * Chick, 
  data.frame=cw , 
  main = "Chick Weights",
  box.show.mean=FALSE,
  box.show.whiskers=FALSE,
  box.show.box=FALSE
  )

比较图

在这个问题中讨论了制作这些的其他方法(包括其他类型的 Tufte 箱线图)。

于 2011-08-07T16:06:30.320 回答
19

我们不应该忘记可爱且(历史上)重要的茎叶情节(塔夫特也喜欢!)。您可以获得数据密度和形状的直接数字概览(当然,如果您的数据集不大于 200 点)。在 R 中,该函数stem会生成您的茎叶显示(在工作区中)。我更喜欢使用fmsbgstem包中的函数直接在图形设备中绘制它。以下是逐叶显示中的海狸体温变化(数据应在您的默认数据集中):

  require(fmsb)
  gstem(beaver1$temp)

在此处输入图像描述

于 2011-12-20T23:51:35.417 回答
18

地平线图(pdf),用于一次可视化多个时间序列。

平行坐标图(pdf),用于多变量分析。

关联马赛克图,用于可视化列联表(参见vcd包)

于 2010-01-18T17:48:48.627 回答
15

除了 Tufte 的优秀作品之外,我还推荐 William S. Cleveland 的书籍:Visualizing Data和 The Elements of Graphing Data。它们不仅非常出色,而且都是在 R 中完成的,而且我相信代码是公开的。

于 2010-01-17T21:27:03.250 回答
14

箱线图!R帮助中的示例:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")

在我看来,这是快速查看数据或比较分布的最方便的方法。对于更复杂的发行版,有一个名为vioplot.

于 2010-06-21T22:39:07.667 回答
11

在我看来,马赛克图符合上述所有四个标准。r 中有一些示例,位于马赛克图下。

于 2010-01-17T21:22:14.773 回答
10

查看 Edward Tufte 的作品,尤其是这本书

您也可以尝试观看他的巡回演讲。它非常好,包括一捆他的四本书。(我发誓我不拥有他出版商的股票!)

顺便说一句,我喜欢他的迷你数据可视化技术。惊喜!谷歌已经把它写在了谷歌代码上

于 2010-01-16T06:09:17.990 回答
0

总结图?如本页所述:

可视化汇总统计和不确定性

于 2010-12-28T23:28:43.713 回答