大多数人没有使用的数据可视化方式

182

直方图和散点图是可视化数据和变量关系的很好的方法,但最近我一直在思考我错过了哪些可视化技术。你认为最不常用的图表类型是什么?

回答应该:

  1. 在实践中不是非常常用。
  2. 不需要太多的背景讨论就可以理解。
  3. 适用于许多常见情况。
  4. 包括可重复运行的代码示例(最好用R),可以附带链接图片。

16
我认为这是一次非常有用的讨论,很遗憾它已经关闭了。 - Alex Brown
2
@AlexBrown:那么为什么不投票重新开放呢?我可以理解这个问题的措辞可能会让人感觉“没有建设性”,但是这个问题在网络上得到了一些最深思熟虑和富有洞见的答案。我很想看到这些答案得到更新和扩展。 - max
2
这个问题可能应该移动到stats.stackoverflow.com。那个网站更适合这个问题。 - naught101
5
很遗憾在此关闭之前没有人提到QQ图,它们非常有用!请参考链接了解详情。 - naught101
1
这个应该重新打开。 - Peter Flom
我已经创建了一个可视化工具和库的列表。我认为这篇文章会为您提供您所寻找的最想要的可视化工具。http://shivganesh.com/2015/05/infovizgeek-encyclopedia-for-visualization-tools/ - Shiv Kumar Ganesh
15个回答

91

我非常赞同其他帖子的观点:Tufte的书籍非常出色,值得一读。

首先,我想向您介绍今年早些时候“看数据”从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)

最终看起来会有点像这样:

alt text

RGL: 交互式3D图形

另一个值得学习的软件包是RGL,它可以轻松地创建交互式3D图形。有很多在线示例可供使用(包括rgl文档)。

R-Wiki提供了一个很好的示例,介绍如何使用rgl绘制3D散点图。

GGobi

另一个值得了解的软件包是rggobi。有一本Springer书籍介绍,还有很多很棒的在线文档和示例,包括在"Looking at Data" 课程中。


很好。感谢您包含代码/图片。 - Ian Fellows
这些是月份边界(不同的月份结束日期不同)。 - Shane
3
很美。你是怎么做到月份的边界呢? - Alex Brown
@AlexBrown看了一下R文件,似乎是用grid.lines费力地制作的。 - sebastian-c
显示剩余2条评论

59

我真的很喜欢点图(doplot),当我向别人推荐它们解决数据问题时,他们总是感到惊喜和高兴。尽管点图非常实用,但它们似乎并没有得到广泛应用,我不知道为什么。

以下是Quick-R中的一个例子: 汽车数据上的点图

我相信Cleveland在点图的发展和传播方面起了主要作用,他的书中的示例(其中可以轻松检测出错误数据)是使用它们的有力论据。请注意,上面的示例只在每行放置一个点,而它们的真正威力在于每行有多个点,并且使用图例来解释每个点的含义。例如,您可以为三个不同的时间点使用不同的符号或颜色,然后轻松地了解不同类别中的时间模式。

在以下示例中(使用了Excel!),您可以清楚地看到哪个类别可能遭受了标签交换的影响。

具有2个组的点图


1
点图和轴交换的散点图有什么不同,其中一个是分类变量? - DrSAR
5
直译:直方图和条形图有什么不同,密度图和折线图有什么不同?通常可以用更基本的几何形状描述许多标准图表类型(例如Bertin的《半统计图形学》),但这并不会使得以某种特定方式绘制图表的洞见变得不那么独特。在这种情况下,您正在绘制两个分类信息(一个垂直,一个通过绘图字符的形状)针对一段连续数据。虽然在大多数软件包中您可以使用散点图来创建它,但它绝不是散点图。流畅翻译:直方图和条形图的区别是什么?密度图和折线图呢?尽管许多标准图表类型可以用更基本的几何形状来描述(如Bertin的《半统计图形学》所述),但这并不意味着以某种特定方式绘制图表的见解不够独特。在这种情况下,您需要绘制两个分类信息(一个垂直,一个通过绘图字符的形状)与一段连续数据的关系。尽管在大多数软件包中您可以使用散点图来创建此类图表,但它们绝不是散点图。 - Ari B. Friedman
3
@gsk3 我并不是故意要表现得刻薄。事实上,我现在(在阅读更多关于图形语法和类似作品的内容后)意识到,这种更高层次的区分对于展示来说可能非常重要。谢谢你展示这个。 - DrSAR
@DrSAR 我并不是想要听起来很防御。我猜这就是 Stack Overflow 评论的本质吧 ;-) - Ari B. Friedman

56

使用极坐标绘制图表确实被低估了——一些人可能会说这是有道理的。我认为,能够证明使用它们的情况并不常见;同时,当这些情况出现时,极坐标图表可以展示线性图表无法展示的数据模式。

我认为这是因为有时候您的数据固有地是极坐标而不是线形——例如,它是循环的(x 坐标表示在多个日子内一天中的时间),或者数据先前映射到了极性特征空间。

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

Polar chart showing site traffic, with peaks at hours 1 and 22

有两种方法(我知道的)可以使用 R 创建此类图表(我使用 R 创建了上面的图表)。其中一种是在基础或网格图形系统中编写自己的函数。另一种更简单的方法是使用circular包。您将使用的函数是'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”,并使用以下组件的默认值:   类型:“角度”   单位:“弧度”   模板:“无”   模数:“asis”   零点:0   旋转:“逆时针” - datayoda
你也可以用线图来实现这个。虽然有点难以阅读,但对于更细粒度的数据或经历多个周期的数据(例如绘制十个周期,然后绘制它们的平均值)非常棒。 - naught101
1
我也遇到了复制图表的困难。最终,我决定使用ggplot2更容易一些。我在Rpubs上留下了一个简短的演示,包括代码和结果:http://rpubs.com/mattbagg/circular - MattBagg
@doug -- 非常精彩的解释!谢谢! - d_a_c321
1
ggplot2的等效代码:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar() - naught101
我编写了一些ggplot2包装器,旨在将测量表示为楔形面积而不是半径。请参阅https://github.com/swihart/aaroseplot上的readMe。 - swihart

55

如果散点图上的点过多,导致图像混乱不清,尝试使用平滑散点图。以下是一个示例:

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

推荐使用 @Dirk Eddelbuettel 提出的 hexbin 软件包来达到相同的目的,但 smoothScatter() 有一个优点,它属于 graphics 软件包,并因此是标准的 R 安装的一部分。

Smiley as a regular or smoothed scatter plot


7
为了完整起见,在 ggplot 中,您也可以通过使用透明度(alpha)与 geom point 相结合来实现此效果。 - Paul Hiemstra
1
这是与核密度估计相同的东西,还是仅仅类似? - endolith

31

关于sparkline和其他Tufte思想,YaleToolkit软件包在CRAN上提供了函数sparklinesparklines

另一个适用于大型数据集的软件包是hexbin,它巧妙地将数据分成桶以处理可能对简单散点图过大的数据集。


5
+1 到小图表。我目前正在开发一个专注于在 R 中创建小图表的软件包——它们是 Sweave 报告中表格的绝佳补充。 - Sharpie
1
很酷!我对Jay在YaleToolkit中的东西不是太满意,我希望表格中有火花线图! - Dirk Eddelbuettel
我刚刚记录了一种只使用 plot 来生成火花线的方法,并在我的问题的更新中得到了这个Tufte论坛帖子的一些帮助。 - Ben
1
Hmisc::describe 的输出的 Hmisc::latex() 版本包括一个小直方图,该直方图被包含在表格中。 - IRTFM

30

小提琴图(将箱形图和核密度估计相结合)是比较新颖且很酷的图表。R语言中的vioplot包可以让你轻松制作这种图表。

这里有一个例子(维基百科链接中也展示了一个例子):

enter image description here


3
小提琴图也可以通过lattice包获得: bwplot(... panel = panel.violin) - David J.
3
ggplot2的小提琴图版本即将推出。https://github.com/wch/ggplot2/wiki/geom_violin - Roman Luštrik
我不认为小提琴图很有用,我更喜欢用抖动显示所有的点。 - Nakx

26

我确实喜欢这个特定数据的“颠簸图”,但很难想象它在更一般的情况下会有用。话虽如此,我认为我们都可以同意,“Learning R”博客非常棒。 - Ian Fellows
7
“Bump chart” 是一种排名数据的平行坐标图。 - hadley
1
这让我想起了斜率图,它非常适合表示随时间变化的排名变化或排名之间的关系:http://charliepark.org/slopegraphs/ - topchef

22

我也喜欢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 谢谢。总有一天我会重写它以接受不同的分组配置。自从我编写那个函数以来,我学到了很多东西! - Ari B. Friedman
1
我喜欢你的图表比tufte的好得多,后者难以阅读。我仍然认为Tukey风格的箱线图更好,尽管一个很好的折衷方案可能是像你这里展示的那样,但是盒子的线应该是3px宽,而不是1px偏移。我认为水平中位数的1px宽线条可能更整洁、更准确。 - naught101

20

我们不应该忘记可爱且(历史上)重要的茎叶图(Tufte 也很喜欢!)。您可以直接获得数据密度和形状的数字概述(当然,如果数据集不超过约200个点)。在 R 中,函数stem会在工作区中生成您的茎叶显示。我更喜欢使用来自fmsb包的gstem函数将其直接绘制到图形设备中。下面是海狸体温变异(数据应位于默认数据集中)的茎-叶显示:

  require(fmsb)
  gstem(beaver1$temp)

输入图像描述


18

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接