在ggplot / R中改变每个面的轴标签格式器

时间:2012-07-20 19:40:20

标签: r facets ggplot2

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

所以,我的问题是:如果单位和比例在不同方面有所不同,我如何指定自定义格式器或转换(即log10)到构面内的特定轴? < / p>

例如,假设我有数据:

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

如何设置显示美元的2x1方面并使用labels=dollarsscale_y_continuous(trans = "log10", ...)计算df$dollars数据?

谢谢!

1 个答案:

答案 0 :(得分:43)

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

我的经验是,来到 ggplot2 格子图形的人们从根本上误解了刻面(或格栅中的格子化)的目的。此功能的开发考虑了一个非常具体的想法:跨多个组的数据可视化共享一个共同的比例。它来自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)

enter image description here

我刚刚猜到了你想要使用的geom_*,我确信这不是你想绘制的,但至少它说明了原理。