在ggplot/R中,每个面板的轴标签格式化程序不同

26

我有一个数据框,记录了一些随时间变化的指标,我想要将它们可视化到一个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=dollarsscale_y_continuous(trans = "log10", ...)df$dollars 数据进行处理?

谢谢!


是的。糟糕。我刚刚发现了一个链接,里面有人遇到了类似的问题:http://comments.gmane.org/gmane.comp.lang.r.ggplot2/4496。 - Stefan Novak
可能更容易的做法是分别绘制两张图,并将它们排列在一起。 - Brian Diggs
1个回答

47
作为你发现的,这个问题并没有简单的解决方案,但它经常出现。由于这种情况经常被问到,我认为解释为什么很难,并提出一个潜在的解决方案是有帮助的。
我的经验是,使用 ggplot2 或 lattice 图形的人们基本上误解了 faceting(或 trellising,在 lattice 中)的目的。这个特性是针对共享公共比例尺的多个组中的数据可视化而开发的。它来自 Tufte 和其他人所倡导的一些叫做小多面体原则的东西。
将具有非常不同比例尺的面板放在一起是视觉设计专家倾向于避免的事情,因为它最多只会产生误导。(我在这里不是责备你,只是解释理由...)
但当然,一旦你把这个伟大的工具公开了,你永远不知道人们会如何使用它。所以 faceting 在 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_*,我确定这不是您想绘制的,但至少它说明了原理。


1
@StefanNovak,我很高兴它有所帮助!我想再次强调,我并没有批评您的设计选择。SO问题的原则之一是它们“永久存在”,因此应该为更多不仅仅是最初提问者提供帮助。正如我所说,这一问题反复出现,所以我的解释更多地是针对未来的读者而非您个人。 - joran
1
@StefanNovak 嗯,一种可行但不太正式的方法是调整坐标轴刻度标签,使它们具有相同数量的数字,即使这意味着用空格填充标签。我确信之前也被问及过这个问题……我会看看是否能找到任何相关信息。 - joran
2
@naught101 我发现在单个面板上分面是一种方便的方式,可以添加一个视觉上吸引人且不占用太多空间的“标题”。 - joran
@joran:我指的是“proper”编码——使用facet系统使用的更原始的函数。我同意这非常吸引人。 - naught101
这对于你想要一个类似于上面示例但在x轴上有不同的分类变量集的情况非常有帮助。 - Lauren Fitch
显示剩余5条评论

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