未被充分利用的数据可视化


178

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

答案应该是:

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

13
我认为这是一个非常有用的讨论,很抱歉,它已经关闭。
亚历克斯·布朗

2
@AlexBrown:那为什么不投票重新开放?我可以看到为什么这个问题的措词可能感觉“不是建设性的”,但是这个问题导致在网络上任何地方都对该主题提出了一些最周到,最有见地的答案。我希望看到这些答案得到更新和扩展。
最大

2
这可能应该移到stats.stackoverflow.com。它更适合该网站。
naught101

4
可惜在关闭之前没有人提到过QQ漏洞。它们是如此有用!
naught101

这应该重新打开。
彼得·弗洛姆

Answers:


89

我非常同意其他海报: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书籍,在线上有很多很棒的文档/示例,包括“查找数据”课程。


很好 感谢您包含代码/图像。
伊恩·研究员

每条黑色实心垂直线中“ Z”或弯曲的垂直位置指示什么?
doug 2010年

这些是月份界限(月份不会在同一天结束)。
Shane 2010年

3
那好美丽。您是如何获得月份界限的?
亚历克斯·布朗


58

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

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

我相信克利夫兰对这些工具的开发和发布负有最大责任,他书中的示例(使用点图可以很容易地检测出错误数据)是使用它们的有力论据。请注意,上面的示例每行仅放置一个点,而它们的真正力量在于每行具有多个点,并附有图例说明哪个是哪个。例如,您可以对三个不同的时间点使用不同的符号或颜色,因此可以轻松地了解不同类别中的时间模式。

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

点阵与2组


1
点图与具有切换轴的散点图有何不同,其中之一是分类的?
DrSAR 2011年

4
@DrSAR直方图与条形图或密度图与线图有何不同?您可以根据更基本的几何形状来描述许多标准图表类型(请参见Bertin的Semiologie Graphique),但这并不能使您以某种独特的方式绘制某些东西。在这种情况下,您将针对一条连续数据绘制两类分类信息(一个垂直,一个由绘图字符的形状绘制)。虽然在大多数软件包中,您都会破解一个散点图来创建它,但最强调的不是散点图。
Ari B. Friedman

2
@ gsk3并不意味着听起来很狡猾。实际上,我(在阅读了更多有关图形和类似作品的语法后)现在意识到,这种较高层次的区别对于演示来说可能非常重要。感谢您展示此内容。
DrSAR 2011年

@DrSAR我并不是故意要防御。我想SO评论的性质;-)
Ari B. Friedman

56

使用极坐标的图肯定没有得到充分利用-有些人会说得很好。我认为证明其使用合理的情况并不常见;我还认为,当出现这些情况时,极坐标图可以揭示线性图无法显示的数据模式。

我认为这是因为有时您的数据本来就是极性的,而不是线性的,例如,它是周期性的(x坐标表示几天中24小时内的时间),或者数据先前已映射到极性要素空间。

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

极坐标图显示站点流量,在第1和22小时达到峰值

有两种方法(我知道)可以使用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)

4
复制您的代码,我得到了一个非常不同的情节(非常难看);知道为什么吗?我收到以下警告:1:在as.circular(xx [,1])中:使用以下组件的默认值将对象强制为类'circular':类型:'angles'单位:'radians'模板:' none'取模:'asis'零:0轮换:'counter'rose.diagdata24DailydayHallthree_palettes
datayoda 2011年

我也有同样的问题。
crayola 2011年

您也可以使用线图进行此操作。可能很难读,但是对于更细粒度的数据或经历一个以上周期的数据(例如,绘制十个周期,然后绘制其平均值),它也确实很棒。
naught101

1
我也很难复制情节。我最终决定使用ggplot2更容易。我在Rpubs上留下了简短的演示,其中包含了代码和结果:rpubs.com/mattbagg/circular
MattBagg 2013年

1
等效的ggplot2:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
naught101

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安装的一部分。

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


6
为了完整起见,您还可以通过结合使用透明度(alpha)和geom point在ggplot中获得此效果。
Paul Hiemstra

1
这与核密度估计相同还是只是相似?
endlith 2012年

30

关于迷你图和其他Tufte想法,CRAN上的YaleToolkit软件包提供了功能sparklinesparklines

另一个对较大数据集有用的软件包是hexbin,因为它巧妙地将数据“ 绑定 ”到存储桶中,以处理对于天真散点图可能太大的数据集。


4
对迷你图+1。我目前正在研究一个专注于R中迷你图创建的程序包-它们为Sweave报表中的表做了很大的补充。
沙皮犬

1
凉!我对Jay在YaleToolkit中的功能不太满意,并希望在表格中包含迷你图!
Dirk Eddelbuettel,2010年

我刚刚记录的方式只能生产使用迷你plot了在更新我的问题,从这个一些帮助塔夫特论坛的帖子

1
Hmisc::latex()从输出的版本,Hmisc::describe包括被列入表中的微型直方图。
IRTFM

28

小提琴图(将箱形图与内核密度结合在一起)相对奇特,非常酷。R中的vioplot软件包使您可以轻松制作它们。

这是一个示例(Wikipedia链接也显示了一个示例):

在此处输入图片说明


3
小提琴情节也可通过点阵软件包获得:bwplot(... panel = panel.violin)
David J.

3
ggplot2版本的小提琴图即将推出。github.com/wch/ggplot2/wiki/geom_violin
RomanLuštrik'2

我并不认为小提琴图是如此有用,我更喜欢用抖动显示所有点。
Nakx

25

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

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

替代文字


我确实喜欢这种特殊数据的凹凸图表,但是很难考虑将要使用的更一般的情况。话虽如此,我认为我们都可以同意Learning R博客动摇了袜子。
伊恩·研究员

7
凹凸图是排名数据的平行坐标图。
哈德利2010年

1
这让我想起了坡度图,它很适合表示随时间变化的排名变化或排名之间的关系:charliepark.org/slopegraphs
topchef 2013年

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箱线图)。


@daroczig谢谢。这些天之一,我将其重写以采用不同的分组配置。自编写该函数以来,我学到了很多东西!
阿里·弗里德曼

1
我喜欢您的地块,比图夫特的地块好得多,后者很难读。我仍然认为Tukey风格的箱形图更好,尽管折衷方案可能与您在此处的情况类似,但是框的线宽为3px,而不是1px的偏移量。而且我认为中位数的1px宽水平线可能更整齐,更准确。
naught101

19

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

  require(fmsb)
  gstem(beaver1$temp)

在此处输入图片说明



15

除了Tufte的出色著作之外,我还推荐William S. Cleveland的书:可视化数据图形数据元素。它们不仅非常出色,而且都在R中完成,我相信代码是公开可用的。


14

箱线图!来自R帮助的示例:

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

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



箱线图没有被充分利用,不是吗?我的意思是,可以肯定的是,在许多论文中,条形图用于应进行箱线绘图的数据,但它们仍然很常见。
naught101

11

在我看来,马赛克图符合上述所有四个条件。在r的马赛克图下有示例。


3
在vcd库中(函数名“ mosaic”)可以更好地实现镶嵌图。它具有更加灵活的方法签名,并且在网格中实现(而不是“基本”图形系统)。

10

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

您也可以尝试捕捉他的旅行演示。很好,其中包括他的四本书。(我发誓我没有他的出版商的股票!)

顺便说一句,我喜欢他的迷你图数据可视化技术。惊喜!谷歌已经将其编写并发布在谷歌代码中


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.