2015-09-11 28 views
2

我正在使用ggplot繪製相當簡單的scatterplot。 我主要感興趣的是說明x和y軸之間的關係。因此,我希望x軸的極限等於y軸的極限。如何將yaxis設置爲與facet_wrap相等的xaxis geom_point

ggplot(VV,aes(x=R1_Zsc,y=R2_Zsc)) + 
    geom_point() + 
    stat_smooth() + 
    facet_wrap(~variable, scales="free") 

我想下面的變種,但沒有工作,要麼:

ggplot(VV, aes(x=R1_Zsc,y=R2_Zsc)) + 
    geom_point() + 
    stat_smooth() + 
    xlim=range(c(VV$R1_Zsc,VV$R2_Zsc)) + 
    ylim=range(c(VV$R1_Zsc,VV$R2_Zsc)) + 
    facet_wrap(~variable, scales="free") 

我已經做了數據幀containingt他xlimits併爲每個變量y的限制,並認爲我可以利用這一點,但我不知道如何。

df_rng <- ddply(VV, .(variable), summarise, min=range(c(R1_Zsc,R2_Zsc))[1],max=range(c(R1_Zsc,R2_Zsc))[2]) 

任何幫助表示讚賞。

謝謝,coord_fixed(ratio=1)似乎沒有工作。我想將xlimylim設置爲相同的值。

這裏是輸出情節 enter image description here

從汽車數據集的示例產生下面的圖:

enter image description here

回答

5

看起來關鍵是按facet組製作最小和最大數據集,並使用該數據集添加geom_blank。一個簡單的例子見this answer

我發現想通過如何使極限數據集成爲這個難題的一部分。我將使用mpg數據集舉例說明。

先用不同尺度的軸線的小面:

ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    facet_wrap(~class, scales = "free") 

enter image description here

現在,進行極限的數據集。我用dplyrtidyr的功能做到這一點。這涉及到找出每個方面組的兩個軸變量的最小最小值和最大值。我在兩個單獨的列中完成此操作,然後將它們收集到一列中。該數據集需要爲每個軸變量實質上具有相同的列,所以我最後添加了具有y軸名稱的重複列。

library(tidyr) 
library(dplyr) 

facetlims = mpg %>% 
    group_by(class) %>% 
    summarise(min = min(displ, hwy), max = max(displ, hwy)) %>% 
    gather(range, displ, -class) %>% 
    mutate(hwy = displ, range = NULL) 

Source: local data frame [14 x 3] 

     class displ hwy 
     (chr) (dbl) (dbl) 
1  2seater 5.7 5.7 
2  compact 1.8 1.8 
3  midsize 1.8 1.8 
4  minivan 2.4 2.4 
5  pickup 2.7 2.7 
6 subcompact 1.6 1.6 
7   suv 2.5 2.5 
8  2seater 26.0 26.0 
9  compact 44.0 44.0 
10 midsize 32.0 32.0 
11 minivan 24.0 24.0 
12  pickup 22.0 22.0 
13 subcompact 44.0 44.0 
14  suv 27.0 27.0 

現在只需添加geom_blank這個數據集的原始圖形和軸限制是每個面內的相同。

ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    facet_wrap(~class, scales = "free") + 
    geom_blank(data = facetlims) 

enter image description here

+0

謝謝,這正是我想要的。我接受了這個答案,因爲它可以讓秤在各個方面都是相同的,同時還有秤。我只需要消化dplyr語法 – user2814482

1

以產生大小相等的軸就可以把ratio=1coord_fixed像本實施例中從?coord_fixed

library(ggplot2) 
qplot(mpg, wt, data = mtcars) + coord_fixed(ratio = 1) 
+0

使用'coord_fixed'僅強制軸上數據單元的物理表示之間的指定比率。然而,這被'facet_wrap'中'scales =「free」'參數覆蓋。看到我的答案如何解決這個問題,而不需要使用'coord_fixed'(當兩個軸的極限彼此不相似時,這可能會對繪圖的顯示產生意想不到的後果)。 – Jaap

2

你接近,但問題是,你指定在錯誤的道路的限制。您不應將您的限制指定爲xlim = range(...)。這將產生以下錯誤:

Error in range(c(mpg$displ, mpg$hwy)) + facet_wrap(~class, scales = "free") : non-numeric argument to binary operator

指定限度的正確方法是xlim(range(...))。從ggplot2mpg數據集的一個例子:

ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    xlim(range(mpg$displ)) + 
    ylim(range(mpg$hwy)) + 
    facet_wrap(~class, scales = "free") 

這給:

enter image description here

如果要比較不同方面的正確的話,你就必須使用同一尺度爲軸。

上述情節的另一種可能是:

ggplot(mpg, aes(displ, hwy)) + 
    geom_point(size=1) + 
    xlim(range(c(mpg$displ, mpg$hwy))) + 
    ylim(range(c(mpg$displ, mpg$hwy))) + 
    facet_wrap(~class, scales = "free") 

這給:

enter image description here


爲了你自己的數據集,一個下面兩個選項應該給你預期結果:

ggplot(VV,aes(x=R1_Zsc,y=R2_Zsc)) + 
    geom_point() + 
    stat_smooth() + 
    xlim(range(VV$R1_Zsc)) + 
    ylim(range(VV$R2_Zsc)) + 
    facet_wrap(~variable, scales="free") 

或:

ggplot(VV,aes(x=R1_Zsc,y=R2_Zsc)) + 
    geom_point() + 
    stat_smooth() + 
    xlim(range(c(VV$R1_Zsc,VV$R2_Zsc))) + 
    ylim(range(c(VV$R1_Zsc,VV$R2_Zsc))) + 
    facet_wrap(~variable, scales="free") 

如果你只希望包括左側面(Y軸)和底部面(X軸)軸的標籤,只是刪除scales="free"

+0

謝謝,但這不正是我想要的,因爲我想要x = y但每個方面都不相同,構造另一個數據框和使用geom_blank的答案就是我一直在尋找的 – user2814482

相關問題