2012-07-20 83 views
22

我有一个数据帧捕获随着时间的推移,我想可视化3X1方面的若干措施。但是,每个度量都包含不同的单位/尺度,这些单位/尺度将受益于自定义转换和标签方案变轴标签格式在ggplot/R

所以,我的问题是:如果单位和尺度在不同的方面是不同的,我怎么能指定一个方面内的特定轴的自定义格式或变换(即log10)?

例如,假设我有数据:

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

一个人怎么会去当设置在显示与labels=dollarsscale_y_continuous(trans = "log10", ...)df$dollars数据索引美元和计数2×1小?

谢谢!

+0

不容易,我想... – 2012-07-20 20:06:33

+0

是的。哪里哪里。我刚刚遇到这个链接,有人有类似的问题:http://comments.gmane.org/gmane.comp.lang.r.ggplot2/4496。 – 2012-07-20 20:07:13

+0

可能更容易做两个独立的情节,并安排他们在一起。 – 2012-07-20 20:19:34

回答

40

当你发现,没有一个简单的解决方案到这一点,但它涉及了很多。由于这类事情经常被问到,所以我觉得解释为什么这很难,并且提出了一个可能的解决方案。

我的经验是,人来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_*,我敢肯定这是不是真的你想要绘制什么,但至少它说明了原理。

+0

谢谢你的深刻反应!我完全理解ggplot2背离了原始设计意图的含义。实际上,我有两个数据集,一个遵循正态分布,另一个遵循对数正态分布,所以我希望能够随时间比较视觉规范化的数据。 对于绘图区域的正确对齐,您有什么见解吗?我之前遇到过'ggExtra'库,据说它为此提供了一些特别的支持,但我会很感激任何方向。 – 2012-07-20 20:27:32

+0

@StefanNovak我很高兴这有帮助!我想再次强调,我并不是在批评你的设计选择。 SO问题的一个原则是他们“永远活着”,所以应该帮助服务的不仅仅是最初的提问者。正如我所说,这个问题反复出现,所以我的解释更多的是针对未来的读者而不是你。 – joran 2012-07-20 20:29:32

+1

@StefanNovak好吧,做这件事的方法是调整轴刻度标签,使它们具有相同的数字位数,即使这意味着用空格填充标签。我敢肯定,之前也被问过......我会看看我能否找到任何相关的东西。 – joran 2012-07-20 20:32:13