2012-07-20 104 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