【问题标题】:Most underused data visualization [closed]最未充分利用的数据可视化[关闭]
【发布时间】:2010-01-16 06:03:53
【问题描述】:

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

答案应该:

  1. 不是很常用 练习。
  2. 无需过多处理即可理解 背景讨论。
  3. 适用于许多常见情况。
  4. 包括可重现的代码来创建 一个例子(最好在 R 中)。链接的图像将是 不错。

【问题讨论】:

  • 我认为这是一个非常有用的讨论,很遗憾它已关闭。
  • @AlexBrown:那为什么不投票重新开放呢?我可以理解为什么这个问题的措辞可能让人感觉“没有建设性”,但是这个问题在网络上的任何地方都产生了一些关于这个主题的最深思熟虑和最有见地的答案。我希望看到这些答案得到更新和扩展。
  • 这应该被移到 stats.stackoverflow.com。它更适合那个网站。
  • 可惜在关闭之前没有人提到QQ-plots。它们太有用了!
  • 这应该重新打开。

标签: graphics r visualization plot ggplot2


【解决方案1】:

我真的同意其他海报:Tufte's books are fantastic,非常值得一读。

首先,我将向您指出今年早些时候“查看数据”中的a very nice tutorial on ggplot2 and ggobi。除此之外,我只强调一个来自 R 的可视化和两个图形包(不像基础图形、晶格或 ggplot 那样广泛使用):

热图

我真的很喜欢可以处理多变量数据的可视化,尤其是时间序列数据。 Heat maps 对此很有用。 David Smith on the Revolutions blog 推荐了一个非常简洁的。这是 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 文档中)。

The R-Wiki has a nice example 了解如何使用 rgl 绘制 3D 散点图。

GGobi

另一个值得了解的包是rggobi。有a Springer book on the subject,还有很多很棒的在线文档/示例,包括"Looking at Data" 课程。

【讨论】:

  • 不错。感谢您提供代码/图片。
  • 每条黑色实线垂直线中的“Z”或弯曲的垂直位置表示什么?
  • 这些是月份的界限(月份不会在同一天结束)。
  • 太漂亮了。您是如何确定月份界限的?
【解决方案2】:

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

下面是 Quick-R 的一个示例:

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

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

【讨论】:

  • 点图与带有切换轴的散点图有何不同,其中一个是分类的?
  • @DrSAR 直方图与条形图有何不同,密度图与线图有何不同?您可以根据更基本的几何图形来描述许多标准图表类型(参见 Bertin 的 Semiologie Graphique),但这并不会降低以特定方式绘制某些东西的洞察力的独特性。在这种情况下,您将针对一条连续数据绘制两条分类信息(一条垂直,一条按绘图字符的形状)。虽然在大多数软件包中,你会破解一个散点图来创建它,但它最强调的不是散点图。
  • @gsk3 并不是要听起来刻薄。事实上,我现在(在阅读了更多关于图形语法和类似作品的内容之后)意识到这种更高层次的区别对于演示非常重要。感谢您展示这一点。
  • @DrSAR 而且我并不是有意为之辩护。我猜 SO cmets 的性质 ;-)
【解决方案3】:

使用极坐标的绘图肯定未被充分利用——有些人会说是有充分理由的。我认为证明使用它们的情况并不常见。我还认为,当出现这些情况时,极坐标图可以揭示数据中的模式,而线性图则不能。

我认为这是因为有时您的数据固有是极坐标而不是线性的 - 例如,它是周期性的(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)

【讨论】:

  • 复制你的代码,我得到一个非常不同的情节(这很丑);知道为什么吗?我收到此警告:1:在 as.circular(xx[, 1]) 中:使用以下组件的默认值将对象强制转换为类“圆形”:类型:“角度”单位:“弧度”模板:“ none' 模:'asis' 零:0 轮换:'counter' rose.diagdata24Daily Site Traffic by Hourthree_palettes
  • 我也有同样的问题。
  • 你也可以用线图来做到这一点。可能有点难以阅读,但对于更细粒度的数据或经历多个周期的数据(例如,绘制十个周期,然后绘制它们的平均值),它也非常棒。
  • 我在复制情节时也遇到了麻烦。我最终决定使用 ggplot2 更容易。我在 Rpubs 上留下了一个简短的演示代码和结果:rpubs.com/mattbagg/circular
  • ggplot2 等效项:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
【解决方案4】:

如果您的散点图有太多点以至于变得一团糟,请尝试平滑散点图。这是一个例子:

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

【讨论】:

  • 为了完整起见,您也可以在ggplot中通过使用透明度(alpha)来获得这种效果。),结合几何点。
  • 这和核密度估计是一样的,还是差不多?
【解决方案5】:

关于迷你图和其他 Tufte 想法,CRAN 上的 YaleToolkit 包提供了函数 sparklinesparklines

另一个对较大数据集有用的包是hexbin,因为它巧妙地将数据“分箱”到桶中,以处理对于幼稚散点图而言可能太大的数据集。

【讨论】:

  • +1 到迷你图。我目前正在开发一个专注于在 R 中创建迷你图的软件包——它们对 Sweave 报告中的表格进行了很好的补充。
  • 酷!我对 Jay 在 YaleToolkit 中的内容不太满意,并且希望在表格中包含迷你图!
  • 我刚刚在我的question 的更新中记录了一种仅使用plot 生成迷你图的方法,并得到了Tufte forum post 的一些帮助
  • Hmisc::latex() 版本的来自Hmisc::describe 的输出包括一个迷你直方图,该直方图包含在表格中。
【解决方案6】:

Violin plots(将箱线图与核密度相结合)比较奇特而且很酷。 R 中的 vioplot 包让你可以很容易地制作它们。

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

【讨论】:

  • 小提琴图也可以通过 lattice 包获得:bwplot(... panel = panel.violin)
  • ggplot2 版本的小提琴情节即将推出。 github.com/wch/ggplot2/wiki/geom_violin
  • 我不认为细小提琴图很有用,我喜欢用抖动的方式显示所有点。
【解决方案7】:

我刚刚回顾的另一个不错的时间序列可视化是the "bump chart"(如this post on the "Learning R" blog 中的特色)。这对于可视化随时间的位置变化非常有用。

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

【讨论】:

  • 我确实喜欢这个特定数据的凹凸图,但很难想到更一般的情况下会使用它。也就是说,我认为我们都同意 Learning R 博客令人震惊。
  • 凹凸图是排名数据的平行坐标图。
  • 这让我想起了坡度图,它可以很好地表示排名随时间的变化或排名之间的关系:charliepark.org/slopegraphs
【解决方案8】:

我也喜欢 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 箱线图)是discussed in this question

【讨论】:

  • @daroczig 谢谢。这些天的某一天,我将重写它以采用不同的分组配置。自从我写了这个函数以来,我学到了很多东西!
  • 我更喜欢你的情节,而不是 tufte 的情节,后者非常难以阅读。我仍然认为 Tukey 风格的箱线图更好,虽然一个很好的折衷可能就像你在这里所拥有的一样,但是盒子的线宽为 3px,而不是 1px 偏移。而且我认为中位数的 1 像素宽水平线可能更整洁,更准确。
【解决方案9】:

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

  require(fmsb)
  gstem(beaver1$temp)

【讨论】:

    【解决方案10】:

    Horizon graphs (pdf),用于一次可视化多个时间序列。

    Parallel coordinates plots (pdf),用于多变量分析。

    Associationmosaic 绘图,用于可视化列联表(请参阅 vcd 包)

    【讨论】:

      【解决方案11】:

      除了 Tufte 的出色作品,我推荐 William S. Cleveland 的书籍:Visualizing DataElements of Graphing Data。它们不仅非常出色,而且都是在 R 中完成的,而且我相信代码是公开的。

      【讨论】:

        【解决方案12】:

        箱线图! R帮助中的示例:

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

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

        【讨论】:

        【解决方案13】:

        在我看来,马赛克图符合上述所有四个标准。 r 中有一些示例,位于马赛克图下。

        【讨论】:

        • 在 vcd 库(函数名称“mosaic”)中更好地实现了马赛克图。它具有更灵活的方法签名,并且在网格中实现(而不是“基础”图形系统)。
        【解决方案14】:

        查看 Edward Tufte 的作品,尤其是 this book

        您也可以尝试捕捉his travelling presentation。它非常好,包括一捆他的四本书。 (我发誓我不拥有他出版商的股票!)

        顺便说一句,我喜欢他的迷你数据可视化技术。惊喜!谷歌已经写好并发布到Google Code

        【讨论】:

          【解决方案15】:

          摘要图?如本页所述:

          Visualizing Summary Statistics and Uncertainty

          【讨论】:

          • 此链接已损坏
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-31
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多