2012-09-24 71 views
12

我想創建一個帶有翻轉座標的刻面圖,其中只有一個座標軸允許每個面有所不同:在ggplot2中使用coord_flip()與facet_wrap(scales =「free_y」)似乎會給出意想不到的刻面軸刻度標記和刻度標記

require(ggplot2) 
p <- qplot(displ, hwy, data = mpg) 
p + facet_wrap(~ cyl, scales = "free_y") + coord_flip() 

enter image description here

該地塊不盡如人意我,因爲錯誤的刻度線和刻度標記重複每個情節。我希望每個水平軸上的刻度線都不在每個垂直軸上。

這是意想不到的行爲,因爲情節意味着水平軸刻度對於頂部面板與底部面板相同,但它們不是。看到這樣的運行:

p <- qplot(displ, hwy, data = mpg) 
p + facet_wrap(~ cyl, scales = "fixed") + coord_flip() 

所以我的問題是:有沒有辦法消除垂直軸的刻度線的右側面,並添加水平軸的刻度線和標籤頂端層面呢?

正如Paul在下面深刻地指出的那樣,我給出的例子可以通過在qplot()中交換x和y並避免coord_flip()來解決,但是這對於所有geoms都不適用,例如,如果我想要水平刻面與自由水平軸柱狀圖我可以運行:

c <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar() 
c + facet_wrap(~cut, scales = "free_y") + coord_flip() 

image

這些方面具有可變的水平軸,但重複垂直軸的刻度線,而不是重複橫軸刻度線。我不認爲保羅的技巧會在這裏工作,因爲與散點圖不同,條形圖不是旋轉對稱的。

我會很樂意聽到任何部分或完整的解決方案。

+0

我認爲你的觀點是有效的。您可以發送電子郵件到ggplot2郵件列表,或者在ggplot2 github問題跟蹤器上創建一個票據。 –

+0

完成。 https://github.com/hadley/ggplot2/issues/673 – orizon

+0

請保留我們的更新信息 –

回答

6

這是第二次或第三次我自己也遇到過這個問題。我發現我可以通過定義自定義幾何來破解我自己的解決方案。

geom_bar_horz <- function (mapping = NULL, data = NULL, stat = "bin", position = "stack", ...) { 
    GeomBar_horz$new(mapping = mapping, data = data, stat = stat, position = position, ...) 
} 

GeomBar_horz <- proto(ggplot2:::Geom, { 
    objname <- "bar_horz" 

    default_stat <- function(.) StatBin 
    default_pos <- function(.) PositionStack 
    default_aes <- function(.) aes(colour=NA, fill="grey20", size=0.5, linetype=1, weight = 1, alpha = NA) 

    required_aes <- c("y") 

    reparameterise <- function(., df, params) { 
    df$width <- df$width %||% 
     params$width %||% (resolution(df$x, FALSE) * 0.9) 
    OUT <- transform(df, 
       xmin = pmin(x, 0), xmax = pmax(x, 0), 
       ymin = y - .45, ymax = y + .45, width = NULL 
    ) 
    return(OUT) 
    } 

    draw_groups <- function(., data, scales, coordinates, ...) { 
    GeomRect$draw_groups(data, scales, coordinates, ...) 
    } 
    guide_geom <- function(.) "polygon" 
}) 

這是僅僅複製從GGPLOT2 github上的geom_bar代碼,然後切換Xÿ引用作水平barplot在標準笛卡爾協調員。

請注意,您需要必須使用position='identity',也可能stat='identity'爲此工作。如果您需要使用身份以外的職位,那麼您必須編輯collide function才能正常工作。

8

使用coord_flipfacet_wrap一起使用是問題所在。首先將某個軸定義爲空(x軸),然後交換該軸,使空心軸變爲y。現在這在ggplot2中沒有很好地複製。

在你的第一個例子,我建議不使用coord_flip,只是交換了變數圍繞您的來電qplot,並使用free_x

p <- qplot(hwy, displ, data = mpg) 
p + facet_wrap(~ cyl, scales = "free_x") 

enter image description here

+1

好吧,我現在得到你的問題。我會避免一起使用'facet_wrap'和'coord_flip'。只要在調用'qplot'時反轉你的變量。看到我更新的答案。 –

+1

這適用於點圖,但不適用於直方圖。我目前與酒吧情節有同樣的問題,我想保持水平,並且找不到解決辦法。 –

2

我剛剛試圖做一個水平的barplot,並遇到這個問題,我想scales = "free_x"。最後,創建傳統(垂直)條形圖似乎更容易),旋轉文本,以便如果將頭部向左傾斜,則看起來就像您想要的情節。然後,一旦你的劇情完成後,旋轉PDF /圖像輸出(!)

ggplot(data, aes(x, y)) + 
    geom_bar(stat = "identity") + 
    facet_grid(var ~ group, scale = "free", space = "free_x", switch = "both") + 
    theme(axis.text.y = element_text(angle=90), axis.text.x = element_text(angle = 90), 
        strip.text.x = element_text(angle = 180)) 

主要關鍵要做到這一點是switch = "both",其中移動小標籤貼到其他軸,其旋轉的element_text(angle=90)軸標籤和文本。