2017-09-05 305 views
1

我有看起來像這樣的數據:使用從twoord.plot功能如何在R中使用twoord.plot()繪製多個圖形(faceting)?

height <- c(1,2,3,4,2,4,6,8) 
weight <- c(12,13,14,15,22,23,24,25) 
person <- c("Jack","Jim","Jill","Tess","Jack","Jim","Jill","Tess") 
set <- c(1,1,1,1,2,2,2,2) 
dat <- data.frame(set,person,height,weight) 

我試圖繪製與同一x軸(人)的曲線圖,和圖2不同的y軸(重量和高度) plotrix包。 但是,我不知道如何面對ggplot2中的情節。

例如,如果我能地塊在GGPLOT2覆蓋,我的代碼看起來是這樣的:

ggplot(data = dat, aes(x = person, y = weight)) + 
    geom_point(color = "red") + facet_wrap(~set, scales="free") 
#And similarly have the height on the other axis. 

如何在twoord.plot實現這一目標(任何想法)?

+0

從[文檔看起來](HTTPS:// rdrr。io/cran/plotrix/man/twoord.plot.html)該函數不使用構面。 – neilfws

+0

我知道。但是我想知道是否有任何「技巧」可以用來解決這個問題? – Ash

+0

沒有「竅門」。您必須對數據進行子集分類,生成單獨的圖並使用_e.g._ par(mfrow = ...)或者[pane](https://rdrr.io/cran/plotrix/man /panes.html)。但我想知道爲什麼你不會簡單地使用'ggplot2'。 – neilfws

回答

1

我覺得這個情節讓人有些困惑,但是這似乎或多或少什麼plotrix::twoord.plot呢,所以讓我知道這是你在想什麼。

在ggplot2中,第二個軸必須基於第一個軸的轉換。因此,我們首先將繪製的高度值轉換爲與權重值相同的範圍(因此它們將出現在基於權重的圖的y範圍內)。然後我們對第二個y軸的比例進行逆向變換(以便y軸比例將對應於數據中的實際高度值)。

ggplot(dat, aes(person)) + 
    geom_point(aes(y=weight), colour="blue") + 
    geom_point(aes(y=height/mean(height/weight)), colour="red", shape=17) + 
    scale_y_continuous(sec.axis=sec_axis(~ . * mean(dat$height/dat$weight), 
             breaks=seq(0,max(dat$height),1), 
             name="height")) + 
    theme_classic() + 
    theme(axis.text.y.right=element_text(colour="red"), 
     axis.text.y=element_text(colour="blue"), 
     axis.title.y.right=element_text(colour="red"), 
     axis.title.y=element_text(colour="blue")) 

enter image description here

這似乎更直觀的我,特別是如果每​​個人的測量(隱含)在時間上排序:

ggplot(dat, aes(weight, height, label=person, group=person)) + 
    geom_line(colour="grey70") + 
    geom_text() 

enter image description here

+0

我認爲這是一個很好的證明,爲什麼自變量輔助軸不鼓勵:) – neilfws

+0

是的,我非常同意! – eipi10

+0

這真的有幫助。對於你的第一個代碼,如果你只是添加'facet_wrap(〜set)',它就可以把它分成塊。 – Ash

0

基礎上的評論,似乎真正的問題是如何使用ggplot2,而不是如何強制plotrix做一些它不能做,以實現適當的情節。

ggplot2中不鼓勵次軸,因爲它們具有誤導性。人們傾向於比較不可比較的值,特別是在線交叉處。因此,sec_axis限於一個變量是另一個變量的直接變換的情況。

我認爲最好使用高度和重量的方面,並設置顏色。這將清楚地顯示每個人的每個變量中的每個變量的變化(我假設它是類似於時間點的)。關鍵是要考慮您試圖突出顯示的數據集的哪些方面並相應地創建圖表。

幾個例子。首先,小面的身高/體重,顏色由集:

library(tidyr) 
library(ggplot2) 
dat %>% 
    gather(var, value, -(1:2)) %>% 
    ggplot(aes(person, value)) + 
    geom_point(aes(color = factor(set))) + 
    facet_wrap(~var, scales = "free_y") 

enter image description here

或由人的色彩,情節設置與每個變量。我會忍不住在這種情況下,用線:

dat %>% 
    gather(var, value, -(1:2)) %>% 
    ggplot(aes(factor(set), value)) + 
    geom_line(aes(color = person, group = person)) + 
    facet_wrap(~var, scales = "free_y") 

enter image description here