2011-07-08 31 views
16

Theo mặc định, trên một ggplot mặt (facet_grid), các nhãn khía cạnh trục y nằm ở bên phải và dấu trục y và nhãn nằm ở bên trái.Có thể chuyển đổi cạnh của trục y và các nhãn trên một ô mặt không?

Có thể chuyển đổi chúng không?

+0

Tôi nghĩ điều đó là không thể, nhưng tôi sẽ rất vui khi bị nhầm lẫn. –

+2

Để thực hiện việc này, bạn sẽ phải tự mình nâng cấp bằng cách sử dụng đồ họa lưới. AFAIK, điều này là không thể sử dụng ggplot vào lúc này. – Andrie

+0

Tôi sợ rằng đó sẽ là câu trả lời. Cảm ơn! – Ryan

Trả lời

8

Koshke viết này một thời gian trở lại, nửa như một trò đùa trên danh sách gửi thư ggplot2: http://groups.google.com/group/ggplot2/browse_thread/thread/5c4658aceea9daf1

d <- data.frame(expand.grid(a=1:2,b=1:2,c=1:2),x=rnorm(8), y=rnorm(8)) 
p <- ggplot(d, aes(x, y)) + facet_grid(a~b) + geom_point() + 
coord_trans(x="reverse", y="reverse") + 
opts(strip.text.x=theme_text(angle=180), 
    strip.text.y=theme_text(angle=90), 
    axis.text.x=theme_text(angle=180), 
    axis.text.y=theme_text(angle=180), 
    axis.title.x=theme_text(angle=180), 
    axis.title.y=theme_text(angle=180)) 
print(p, vp=viewport(angle=180)) 

Bạn rõ ràng sẽ phải phản ánh nó hay "lật theo chiều dọc" cho hiệu quả mong muốn, nhưng tôi không chắc chắn làm thế nào hoặc nếu bạn có thể làm điều đó với phần mềm hình ảnh hiện đại.

Ngoài ra còn có ... + coord_flip() đặt trục y ở dưới cùng và trục x ở bên trái.

+4

+1 cho bộ nhớ của bạn. Vâng, đây là một loại trò đùa. Tại thời điểm này ggplot không thể làm việc đó. – kohske

+0

Rất tiếc. Cảm ơn, tôi sẽ phải quyết định nếu nó có giá trị nó để tiết kiệm như một pdf và chuyển đổi các mặt bằng tay trong một chương trình đồ họa vector. – Ryan

2

Tôi đã viết điều này cho các nhu cầu của mình. Nếu bạn sử dụng nó với switch = "y", bạn đã hoàn thành nửa chừng.

Bạn vẫn cần phải sửa đổi nó để chuyển trục, có thể mất thêm một số công việc vì trục và phá vỡ tạo thành một cột trong một gtable, vì vậy bạn sẽ cần phải phân tích nó thêm.

switch_facet_strip <- function(p, switch = c("x", "y")) { 

    require(gtable) 
    rbind_gtable <- gtable:::rbind_gtable 
    cbind_gtable <- gtable:::cbind_gtable 

    if ("y" %in% switch) 
    p <- p + theme(strip.text.y = element_text(vjust = 0.5, angle = 90)) 

    g <- ggplotGrob(p) 


    gdim <- as.numeric(g$layout[g$layout$name == "background", c("b", "r")]) 
    tpos <- g$layout[g$layout$name == "strip-top", "b"][1] 
    rpos <- g$layout[g$layout$name == "strip-right", "r"][1] 
    new_tpos <- g$layout[g$layout$name == "axis-b", "b"][1] + 1 
    new_rpos <- g$layout[g$layout$name == "axis-l", "r"][1] - 1 

    if ("x" %in% switch) { 
    g <- rbind_gtable(
      rbind_gtable(
       gtable_add_rows(
       rbind_gtable(g[1:tpos-1, ] , g[(tpos+1):(new_tpos-1), ], "first"), 
       unit(5, units = "mm")), 
       g[tpos, ], "first"), 
      g[new_tpos:gdim[1], ], "first") 
    } 

    if ("y" %in% switch) { 
    g <- cbind_gtable(
      cbind_gtable(
      gtable_add_cols(
       cbind_gtable(g[, 1:new_rpos], g[, rpos], "first"), 
       unit(5, units = "mm")), 
      g[, (new_rpos+2):rpos-1], "first"), 
      g[, (rpos+1):gdim[2]], "first") 
    } 

    grid.newpage() 
    grid.draw(g) 
} 

Lưu ý: Hack này cho phép tôi chuyển cả hai dải bên cạnh nhãn trục tương ứng. Nó chỉ có ý nghĩa nếu bạn đang sử dụng một chủ đề trong đó dải không có nguồn gốc. Tôi nghĩ rằng đây là cách đúng để hiển thị nhãn khía cạnh bởi vì nó cho phép đọc cốt truyện như một bảng đa phương tiện. Hơn nữa, các nhãn khía cạnh nằm bên cạnh các trục vỡ, làm cho nó rõ ràng hơn nhiều những gì các trục đại diện. Bất cứ ai khác nghĩ rằng điều này có ý nghĩa? Tôi ước nó là một lựa chọn trong ggplot.

The right way to display facet grids

+0

Điều này thật tuyệt! Cảm ơn rất nhiều. Và tôi đồng ý, điều này nên là một lựa chọn tiêu chuẩn trong ggplot. – ROLO

+0

phiên bản phát triển hiện có tùy chọn 'chuyển đổi '! – lionel

0

Như ggplot2 được dựa trên đồ họa lưới, sử dụng gói gridExtra bạn có thể "swich" bên cho dải khía cạnh trong ggplot. Sự đau đớn duy nhất về phương pháp này là xác định tọa độ theo cách thủ công. cho văn bản.

# Some data 
d <- data.frame(expand.grid(a=1:2,b=1:2,c=1:2),x=rnorm(8), y=rnorm(8)) 

# ggplot 
p <- ggplot(d, aes(x, y)) + 
    geom_point() + 
    facet_grid(a~b) + 
    xlab("") + 
    ylab("") + 
    theme(strip.background = element_blank(), 
     strip.text = element_blank()) 

# Add x and y labels 
p <- arrangeGrob(p, sub = textGrob(label = c("1", "2"), x = c(0.29, 0.73), 
    hjust = -0.1, vjust = -0.8, gp = gpar(fontsize = 10)), left = textGrob(label = 
    c("1", "2"), y = c(0.27, 0.70), hjust = 0, vjust = 1.8, 
    gp = gpar(fontsize = 10, lineheight = 0.5), rot = 90)) 

# View 
p 
Các vấn đề liên quan