2011-09-14 35 views
6

Tôi có một ô dòng ggplot2 với một số mặt lẻ. Tôi muốn thêm một ô của phân phối biên của các giá trị x trong không gian trống. Khung hình nên nằm ngang và chia sẻ trục x chung với các khía cạnh khác. Vì geom hộp mặc định là dọc, cần có coord_flip(). Bởi vì điều này, tôi không tin rằng nó có thể bao gồm các dữ liệu boxplot trong cùng một df như các khía cạnh khác bằng cách sử dụng một biến yếu tố giả cho faceting.Căn chỉnh các trục ggplot2 sử dụng lưới

Sử dụng grid, tôi có thể xác định chế độ xem trống và chèn ô, nhưng tôi muốn có đường x trục. Các câu trả lời cho các câu hỏi tương tự (xem here hoặc here) đề xuất sử dụng align_plots trong gói ggExtra, nhưng tôi không tin rằng điều đó sẽ phù hợp với các khía cạnh. Tôi đã bao gồm một ví dụ tái sản xuất đơn giản dưới đây. Nếu tôi làm việc này, tôi cũng sẽ phải chỉnh sửa bảng Grob trống để tạo một nhãn mới phù hợp với các khía cạnh khác. Mọi lơi đê nghị đêu nên được đanh gia cao.

library(ggplot2) 
#generate df for faceted line graphs 
df <- data.frame(x = rep(1:100, times=7), 
     facet_var = as.factor(rep(1:7, each=100)), 
     y = runif(7*100) 
    ) 
#create faceted line graphs 
p <- ggplot(data = df, aes(x, y)) + 
    geom_line() + facet_wrap(~ facet_var, ncol=2) 

#generate df for boxplot 
xdata <- runif(1000, min = 0, max = 100) 
boxdf <- data.frame(x=xdata, group=rep(1,length(xdata))) 

#create boxplot removing axes and margins 
q <- ggplot(data = boxdf, aes(as.factor(group),x)) + geom_boxplot() + 
     coord_flip() + labs(x=NULL) + 
     opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), 
     axis.text.y = theme_blank(), axis.title.y=theme_blank(), 
     axis.ticks = theme_segment(colour = "white"), 
     panel.margin = 0, plot.margin = unit(rep(0,4), "lines") 
     ) 

print(p) 
downViewport("panel-14-5") 
print(q, newpage=F) 

Edit: Sau câu trả lời hữu ích kohske, tôi đã cố gắng để thích ứng với các mã cho giới hạn x khác nhau và phá vỡ. Đây là mã chỉ với giới hạn x và ngắt được thay đổi cho một phạm vi (0,80). Có thể tôi đang thiếu một cái gì đó trong mã mà cần phải được thay đổi với các giới hạn.

library(ggplot2) 
df <- data.frame(x = rep(1:80, times=7), 
     facet_var = as.factor(rep(1:7, each=80)), 
     y = runif(7*80) 
    ) 

# label for marginal plot 
df <- rbind(df, data.frame(x = NA, y = NA, facet_var = "Boxplot wow")) 

p <- ggplot(data = df, aes(x, y)) + 
    geom_line() + facet_wrap(~ facet_var, ncol=2) + 
    # set limits for adjustment 
    coord_cartesian(xlim = c(0, 80)) + 
    #scale_x_continuous(breaks = 1:4*20) 
    opts() 

xdata <- runif(1000, min = 0, max = 80) 
boxdf <- data.frame(x=xdata, group=rep(1,length(xdata))) 

q <- ggplot(data = boxdf, aes(as.factor(group),x)) + geom_boxplot() + 

    # set breaks and limits for adjustment 
    coord_flip(ylim = c(0, 80)) + labs(x=NULL) + 
    scale_y_continuous(breaks = 1:4*20) + 

    # opts for full region drawing: 
    # see https://kohske.wordpress.com/2010/12/25/drawing-on-full-region-in-ggplot2/ 
    opts(
    legend.position = "none", 
    panel.margin = unit(0,"null"), 
    plot.margin = rep(unit(0,"null"),4), 
    axis.ticks = theme_blank(), 
    axis.text.x = theme_blank(), 
    axis.text.y = theme_blank(), 
    axis.title.x = theme_blank(), 
    axis.title.y = theme_blank(), 
    axis.ticks.length = unit(0,"null"), 
    axis.ticks.margin = unit(0,"null") 
) 

print(p) 

# remove unused panel 
grid.remove("panel-14-5") 

downViewport("panel-14-5") 
print(q, newpage=F) 

enter image description here

Trả lời

7

đây là một hack hơi bẩn:

library(ggplot2) 
df <- data.frame(x = rep(1:100, times=7), 
     facet_var = as.factor(rep(1:7, each=100)), 
     y = runif(7*100) 
    ) 

# label for marginal plot 
df <- rbind(df, data.frame(x = NA, y = NA, facet_var = "Boxplot wow")) 

p <- ggplot(data = df, aes(x, y)) + 
    geom_line() + facet_wrap(~ facet_var, ncol=2) + 
    # set limits for adjustment 
    coord_cartesian(xlim = c(0, 100)) 

xdata <- runif(1000, min = 20, max = 80) 
boxdf <- data.frame(x=xdata, group=rep(1,length(xdata))) 

q <- ggplot(data = boxdf, aes(as.factor(group),x)) + geom_boxplot() + 

    # set breaks and limits for adjustment 
    coord_flip(ylim = c(0, 100)) + labs(x=NULL) + 
    scale_y_continuous(breaks = 1:5*20) + 

    # opts for full region drawing: 
    # see https://kohske.wordpress.com/2010/12/25/drawing-on-full-region-in-ggplot2/ 
    opts(
    legend.position = "none", 
    panel.margin = unit(0,"null"), 
    plot.margin = rep(unit(0,"null"),4), 
    axis.ticks = theme_blank(), 
    axis.text.x = theme_blank(), 
    axis.text.y = theme_blank(), 
    axis.title.x = theme_blank(), 
    axis.title.y = theme_blank(), 
    axis.ticks.length = unit(0,"null"), 
    axis.ticks.margin = unit(0,"null") 
) 

print(p) 

# remove unused panel 
grid.remove("panel-14-5") 

downViewport("panel-14-5") 
print(q, newpage=F) 

enter image description here

+0

này thực hiện chính xác những gì tôi cần. Cảm ơn! Các tùy chọn vẽ toàn khu vực có bao giờ kết thúc được kết hợp làm chủ đề trong 'ggExtra' không? – Sandy

+0

Đây là bộ sưu tập các chủ đề được đóng góp. https://github.com/hadley/ggplot2/wiki/Themes Tôi không chắc chắn nếu chúng được nhập vào ggExtra. – kohske

+0

@Sandy có 'opts_full' http://ggextra.googlecode.com/svn/trunk/R/themes.r nhưng' ggExtra' không nên ở trong một thời gian dài, hy vọng. – baptiste

Các vấn đề liên quan