最缺乏使用的数据可视化

Ian*_*ows 176 graphics plot visualization r ggplot2

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

答案应该:

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

Sha*_*ane 88

我真的同意其他海报:Tufte的书非常棒,非常值得一读.

首先,我会在今年早些时候向您介绍一个关于ggplot2和ggobi的非常好的教程.除此之外,我只是强调R中的一个可视化,以及两个图形包(它们不像基本图形,网格或ggplot那样广泛使用):

热图

我非常喜欢可以处理多变量数据的可视化,尤其是时间序列数据. 热图对此非常有用.大卫·史密斯在革命博客上发表了一篇非常简洁的文章.这是ggplot代码由Hadley提供:

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)
Run Code Online (Sandbox Code Playgroud)

最终看起来有点像这样:

替代文字

RGL:交互式3D图形

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

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

GGobi

另一个值得了解的包是rggobi.有关于这个主题的Springer书籍,以及许多在线文档/示例,包括"查看数据"课程.

  • 那好美丽.你是如何实现月界的? (3认同)

dou*_*oug 56

使用极坐标的情节肯定未被充分利用 - 有些人会说有充分理由.我认为证明其使用合理性的情况并不常见; 我还认为,当这些情况出现时,极坐标图可以揭示线性图不能的数据模式.

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

这是一个例子.此图显示了网站按小时计算的平均流量.请注意晚上10点和凌晨1点的两个尖峰.对于本网站的网络工程师来说,这些是重要的; 它们也很重要,它们彼此相邻(仅相隔两个小时).但是如果你在传统的坐标系上绘制相同的数据,这个模式将被完全隐藏 - 线性绘制,这两个尖峰将相隔20小时,虽然它们在连续几天也只相差两小时.上面的极坐标图以简洁直观的方式显示了这一点(传说不是必需的).

显示网站流量的极坐标图,在第1和第22小时显示峰值

有两种方法(我知道)使用R创建这样的图(我在上面用w创建了图).一种是在基本或网格图形系统中编写自己的函数.换句话说,更容易的是使用圆形包装.你将使用的函数是' 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)
Run Code Online (Sandbox Code Playgroud)

  • 复制你的代码,我得到一个非常不同的情节(这是非常难看的); 任何想法为什么?我得到这个警告:1:在as.circular(xx [,1])中:使用以下组件的默认值将对象强制转换为"圆形"类:类型:'角度'单位:'弧度'模板:'无'模数:'asis'零:0轮换:'计数器'rose.diagdata24Daily网站流量由Hourthree_palettes (4认同)

Ari*_*man 56

我真的很喜欢dotlot,并且当我向其他人推荐它们以获得适当的数据问题时,他们总是感到惊讶和高兴.它们似乎没有多大用处,我无法弄清楚原因.

这是Quick-R的一个例子: 关于汽车数据的dotplot

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

在下面的示例中(在所有内容的Excel中完成!),您可以清楚地看到标签交换可能遇到的类别.

Dotplot有2组

  • @DrSAR直方图与条形图不同,或密度图与线图不同?您可以根据更基本的几何形状描述许多标准图表类型(参见Bertin的_Semiologie Graphique_),但这并不能使人们以某种​​特定的方式绘制某些不那么独特的东西.在这种情况下,您正在绘制两条分类信息(一条垂直,一条通过绘图字符的形状)与一条连续数据.虽然在大多数软件包中你都会破解散点图来创建它,但最重要的是它不是散点图. (4认同)
  • @gsk3 并不是要听起来很尖刻。事实上,我现在(在阅读了更多关于图形语法和类似作品的内容后)意识到这种更高层次的区别对于展示非常重要。感谢您展示这一点。 (2认同)

nul*_*lob 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为了完整起见,您还可以使用透明度(alpha)在ggplot中获得此效果.),与geom point结合使用. (6认同)

Dir*_*tel 30

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

另一个对大型数据集有用的软件包是hexbin,因为它巧妙地将数据"分类"到桶中以处理可能对于天真的散点图来说太大的数据集.

  • 迷你裙+1.我目前正致力于一个专注于R中迷你线创建的软件包 - 它们在Sweave报告中为表格做了很多补充. (4认同)

Jas*_*ram 28

小提琴情节(结合箱形图与核密度)是相对异国情调和非常酷.R中的vioplot软件包允许您轻松制作它们.

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

在此输入图像描述

  • 小提琴图也可通过格子包获得:`bwplot(... panel = panel.violin)` (3认同)
  • ggplot2版本的小提琴情节即将推出.https://github.com/wch/ggplot2/wiki/geom_violin (3认同)

Sha*_*ane 25

我刚刚回顾的另一个不错的时间序列可视化是"凹凸图表"(正如"学习R"博客上的这篇文章所述).这对于可视化位置随时间的变化非常有用.

您可以在http://learnr.wordpress.com/上阅读有关如何创建它的信息,但最终结果如下:

替代文字

  • 凹凸图表是排名数据的平行坐标图. (7认同)

Ari*_*man 20

我也喜欢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
  )
Run Code Online (Sandbox Code Playgroud)

compareplot

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


Ric*_*ton 18

Horizo​​n图(pdf),用于一次可视化多个时间序列.

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

关联镶嵌图,用于可视化列联表(参见vcd包)


Gee*_*cid 18

我们不应该忘记可爱和(历史上)重要的茎叶情节(Tufte也喜欢!).您可以直接获得数据密度和形状的数值概览(当然,如果您的数据集不大于约200个点).在R中,该函数stem产生您的茎叶展开(在工作区中).我更喜欢使用gstempackage fmsb中的函数直接在图形设备中绘制它.以下是逐个叶子显示的海狸体温变化(数据应该在您的默认数据集中):

  require(fmsb)
  gstem(beaver1$temp)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Pet*_*ica 15

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


mbq*_*mbq 14

盒形图!R帮助示例:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢小提琴情节. (4认同)
  • 这里也可以提到Beanplot http://www.jstatsoft.org/v28/c01/paper和http://cran.r-project.org/web/packages/beanplot/index.html (2认同)

Pet*_*ica 11

在我看来,马赛克图符合所提到的所有四个标准.r中有一些例子,在马赛克图下.

  • 更好地实现马赛克图是在vcd库中(函数名称'mosaic').它具有更灵活的方法签名,并且在网格中实现(而不是"基础"图形系统). (3认同)

Pau*_*sik 10

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

您也可以尝试捕捉他的旅行演示文稿.它非常好,包括他的四本书.(我发誓我不拥有他的出版商的股票!)

顺便说一句,我喜欢他的迷你数据可视化技术.惊喜!Google已经将其编写并将其发布在Google Code上