25

我有一个数据框随着时间的推移捕获几个度量值,我想可视化一个 3x1 方面。但是,每个度量都包含不同的单位/比例,这些单位/比例可以从自定义转换和标签方案中受益。

所以,我的问题是:如果不同方面的单位和比例不同,我如何为一个方面中的特定轴指定自定义格式化程序或转换(即 log10)?

例如,假设我有数据:

df = data.frame(dollars=10^rlnorm(50,0,1), counts=rpois(50, 100))
melted.df = melt(df, measure.var=c("dollars", "counts"))

如何设置一个 2x1 刻面来显示美元并使用labels=dollars数据scale_y_continuous(trans = "log10", ...)计算索引df$dollars

谢谢!

4

1 回答 1

47

正如您所发现的那样,没有一个简单的解决方案,但它出现了很多。由于这种事情经常被问到,我发现解释为什么这很难,并提出一个潜在的解决方案很有帮助。

我的经验是,使用ggplot2lattice图形的人从根本上误解了刻面(或格子,在lattice中)的目的。开发此功能时考虑到了一个非常具体的想法:跨共享相同规模的多个组的数据可视化。它来自于 Tufte 和其他人所拥护的称为小倍数原理的东西。

视觉设计专家倾向于避免将具有不同比例的面板彼此相邻放置,因为它充其量可能会产生误导。(我不是在这里骂你,只是解释理由......)

但是,当然,一旦你公开了这个伟大的工具,你永远不知道人们将如何使用它。所以它被拉长了:要求能够允许比例因面板而异,并为每个面板分别设置绘图的各个方面。因此,ggplot2中的刻面已远远超出其最初的意图。

这样做的一个后果是,由于该功能的原始设计意图,某些事情很难实现。这很可能就是这样一个例子。

好的,足够的解释。这是我的解决方案。

这里的诀窍是要认识到您没有绘制共享比例的图形。对我来说,这意味着你根本不应该考虑使用刻面。相反,分别制作每个图,并将它们排列在一个图中:

library(gridExtra)

p1 <- ggplot(subset(melted.df,variable == 'dollars'),
                aes(x = value)) + 
            facet_wrap(~variable) + 
            geom_density() + 
            scale_x_log10(labels = dollar_format())

p2 <- ggplot(subset(melted.df,variable == 'counts'),
                aes(x = value)) + 
            facet_wrap(~variable) + 
            geom_density()

grid.arrange(p1,p2)

在此处输入图像描述

我刚刚猜到geom_*你想用什么,我敢肯定这不是你想要绘制的,但至少它说明了原理。

于 2012-07-20T20:20:33.167 回答