直方图和散点图是可视化数据以及变量之间关系的好方法,但是最近我一直在想我缺少什么可视化技术。您认为最未被充分利用的情节类型是什么?
答案应该是:
- 在实践中不是很常用。
- 无需大量背景讨论就可以理解。
- 适用于许多常见情况。
- 包括可复制的代码以创建示例(最好在R中)。链接的图像会很好。
直方图和散点图是可视化数据以及变量之间关系的好方法,但是最近我一直在想我缺少什么可视化技术。您认为最未被充分利用的情节类型是什么?
答案应该是:
Answers:
我非常同意其他海报:Tufte的书很棒,值得一读。
首先,我将为您指出今年年初“看数据”中有关ggplot2和ggobi的非常不错的教程。除此之外,我将只重点介绍R中的一个可视化和两个图形包(它们不如基本图形,点阵图或ggplot广泛使用):
热图
我非常喜欢可以处理多元数据(特别是时间序列数据)的可视化。 热图可能对此有用。大卫•史密斯(David Smith)在“革命”博客上发表了一个真正整洁的文章。这是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书籍,在线上有很多很棒的文档/示例,包括“查找数据”课程。
我非常喜欢dotplot,发现当我将它们推荐给其他人以解决适当的数据问题时,他们总是会感到惊讶和高兴。他们似乎没有多大用处,我也不知道为什么。
这是来自Quick-R的示例:
我相信克利夫兰对这些工具的开发和发布负有最大责任,他书中的示例(使用点图可以很容易地检测出错误数据)是使用它们的有力论据。请注意,上面的示例每行仅放置一个点,而它们的真正力量在于每行具有多个点,并附有图例说明哪个是哪个。例如,您可以对三个不同的时间点使用不同的符号或颜色,因此可以轻松地了解不同类别中的时间模式。
在下面的示例中(在Excel中完成所有操作!),您可以清楚地看到哪个类别可能遭受了标签交换。
使用极坐标的图肯定没有得到充分利用-有些人会说得很好。我认为证明其使用合理的情况并不常见;我还认为,当出现这些情况时,极坐标图可以揭示线性图无法显示的数据模式。
我认为这是因为有时您的数据本来就是极性的,而不是线性的,例如,它是周期性的(x坐标表示几天中24小时内的时间),或者数据先前已映射到极性要素空间。
这是一个例子。该图显示了网站的平均小时流量。注意晚上10点和凌晨1点的两个峰值。对于站点的网络工程师而言,这些意义重大。它们彼此靠近发生也很重要(只是相隔两个小时)也很重要。但是,如果您在传统坐标系上绘制相同的数据,则将完全隐藏该模式-线性绘制,这两个峰值之间相隔20小时,尽管连续几天也相距仅两个小时。上面的极坐标图以简约和直观的方式显示了此信息(不需要图例)。
有两种方法(我知道)可以使用R创建这样的绘图(我在w / 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)
qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
如果您的散点图有太多的点以至于变得完全混乱,请尝试使用平滑的散点图。这是一个例子:
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安装的一部分。
关于迷你图和其他Tufte想法,CRAN上的YaleToolkit软件包提供了功能sparkline
和sparklines
。
另一个对较大数据集有用的软件包是hexbin,因为它巧妙地将数据“ 绑定 ”到存储桶中,以处理对于天真散点图可能太大的数据集。
Hmisc::latex()
从输出的版本,Hmisc::describe
包括被列入表中的微型直方图。
bwplot(... panel = panel.violin)
我刚刚查看的另一个不错的时间序列可视化效果是“凹凸图”(如“ 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
)
箱线图!来自R帮助的示例:
boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
我认为这是快速查看数据或比较分布的最方便的方法。对于更复杂的发行版,有一个扩展名为vioplot
。