直方图和散点图是可视化数据和变量之间关系的好方法,但最近我一直想知道我缺少哪些可视化技术。你认为最未被充分利用的情节是什么?
答案应该:
- 在实践中不是很常用。
- 无需大量背景讨论即可理解。
- 适用于许多常见情况。
- 包括可重现的代码以创建示例(最好在 R 中)。链接的图像会很好。
直方图和散点图是可视化数据和变量之间关系的好方法,但最近我一直想知道我缺少哪些可视化技术。你认为最未被充分利用的情节是什么?
答案应该:
我真的同意其他海报:塔夫特的书很棒,值得一读。
首先,我会向您指出今年早些时候“查看数据”中关于 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 书籍,以及许多很棒的在线文档/示例,包括“查看数据”课程。
我真的很喜欢点图,并且发现当我将它们推荐给其他人以解决适当的数据问题时,他们总是会感到惊讶和高兴。它们似乎没有多大用处,我不知道为什么。
这是来自 Quick-R 的示例:
我相信克利夫兰对这些的开发和颁布负有最大的责任,他书中的例子(其中有缺陷的数据很容易用点图检测到)是使用它们的有力论据。请注意,上面的示例每行仅放置一个点,而它们的真正威力来自每行上有多个点,并带有说明哪个是哪个的图例。例如,您可以为三个不同的时间点使用不同的符号或颜色,从而轻松了解不同类别的时间模式。
在下面的示例中(在 Excel 中完成所有事情!),您可以清楚地看到哪个类别可能遭受了标签交换的影响。
使用极坐标的绘图肯定没有得到充分利用——有些人会说有充分的理由。我认为证明使用它们的情况并不常见。我还认为,当出现这些情况时,极坐标图可以揭示数据中的模式,而线性图则不能。
我认为这是因为有时您的数据本质上是极性的而不是线性的——例如,它是周期性的(x 坐标表示多天 24 小时内的时间),或者数据先前已映射到极性特征空间。
这是一个例子。此图按小时显示网站的平均流量。注意晚上 10 点和凌晨 1 点的两个峰值。对于站点的网络工程师来说,这些意义重大;它们彼此靠近(仅相隔两个小时)也很重要。但是,如果您在传统坐标系上绘制相同的数据,则该模式将完全隐藏——线性绘制,这两个尖峰将相隔20小时,尽管它们在连续几天中也仅相隔两个小时。上面的极坐标图以简洁和直观的方式显示了这一点(不需要图例)。
有两种方法(我知道)使用 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)
如果您的散点图有太多的点以至于变得一团糟,请尝试平滑散点图。这是一个例子:
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 安装的一部分。
关于 sparkline 和其他 Tufte 想法,CRAN上的YaleToolkit包提供了函数和. sparkline
sparklines
另一个对较大数据集有用的包是hexbin,因为它巧妙地将数据“分箱”到桶中,以处理对于幼稚散点图而言可能太大的数据集。
我刚刚回顾的另一个不错的时间序列可视化是“凹凸图”(如“Learning R”博客上的这篇文章中所介绍的)。这对于可视化位置随时间的变化非常有用。
您可以在http://learnr.wordpress.com/上阅读有关如何创建它的信息,但这就是它最终的样子:
我也喜欢 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 箱线图)。
我们不应该忘记可爱且(历史上)重要的茎叶情节(塔夫特也喜欢!)。您可以获得数据密度和形状的直接数字概览(当然,如果您的数据集不大于 200 点)。在 R 中,该函数stem
会生成您的茎叶显示(在工作区中)。我更喜欢使用fmsbgstem
包中的函数直接在图形设备中绘制它。以下是逐叶显示中的海狸体温变化(数据应在您的默认数据集中):
require(fmsb)
gstem(beaver1$temp)
除了 Tufte 的优秀作品之外,我还推荐 William S. Cleveland 的书籍:Visualizing Data和 The Elements of Graphing Data。它们不仅非常出色,而且都是在 R 中完成的,而且我相信代码是公开的。
箱线图!R帮助中的示例:
boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
在我看来,这是快速查看数据或比较分布的最方便的方法。对于更复杂的发行版,有一个名为vioplot
.
在我看来,马赛克图符合上述所有四个标准。r 中有一些示例,位于马赛克图下。
总结图?如本页所述: