2013-03-05 14 views
12

Vì một số lý do, hàm tôi đang phù hợp với ggplot2 đang mở rộng ra ngoài trục y, mặc dù giá trị tối thiểu có thể đạt được bằng không. Vì vậy, trong cố gắng để hạn chế giới hạn dưới bằng không, tôi nhận thấy rằng dường như người ta không thể đặt chỉ giới hạn dưới để các điểm dữ liệu bị bỏ qua (hoặc các điểm dự đoán, rõ ràng). Điều này có đúng không?ggplot2 - đặt giới hạn dưới lớn hơn điểm thấp nhất

Ví dụ, người ta có thể sử dụng expand_limits để thu nhỏ, vì nó là:

require(ggplot2) 
p = ggplot(mtcars, aes(wt, mpg)) + geom_point() 
p + expand_limits(y=0) 

Nhưng người ta không thể phóng to:

p + expand_limits(y=15) 

Cùng với việc thiết lập thẩm mỹ:

p + aes(ymin=0) 
p + aes(ymin=15) 

Tôi biết tôi có thể sử dụng ylim, coord_cartesian, v.v. để đặt cả hai giới hạn trên và dưới, nhưng trong trường hợp này, tôi chuyển danh sách tới ggplot bằng cách sử dụng lapply và các thay đổi giới hạn trên dựa trên đối tượng nào trong danh sách đang được vẽ. Vì vậy, tôi trở lại để vẽ từng đồ vật riêng lẻ, điều này rất tẻ nhạt. Bất kỳ ý tưởng?

EDIT: Hadley xác nhận điều này là không thể, do đó, giải pháp thay thế bằng @Arun sẽ phải làm!

+0

tôi dường như không thể tìm thấy nó ngay bây giờ, nhưng tôi cảm thấy chắc chắn điều này đã được thảo luận trong danh sách gửi thư ggplot2. Sự hồi tưởng mơ hồ của tôi là một số người đưa ra ý tưởng cho phép bạn truyền 'Inf' hoặc' -Inf' thành 'xlim' và' ylim' nhưng việc thực hiện thực tế lại phức tạp hơn nhiều so với nó. – joran

+5

@jslefche, như một công việc xung quanh, bạn không thể đặt nó là 'ylim (your_val, max (mtcars $ mpg))'? (khi bạn lặp lại, bạn có thể vượt qua giá trị tối đa của dữ liệu đó mọi lúc ..)? joran, bạn có chắc nó là cho 'xlim' và không cho' geom_rect'? – Arun

+1

@Arun Tôi biết Inf có thể được sử dụng trong geom_rect, tôi thực sự cảm thấy như tôi nhớ yêu cầu này xuất hiện trên danh sách gửi thư, và một số người cho rằng nó sẽ là tốt đẹp nếu bạn có thể vượt qua Inf và -Inf để xlim và ylim , và rồi Hadley hoặc ai đó giải thích rằng điều đó sẽ tốt đẹp, nhưng rất khó thực hiện. – joran

Trả lời

1

Nó phụ thuộc vào cách bạn muốn âm mưu đồ thị, nhưng nếu bạn có thể tạo một vector của các giới hạn trên cho mỗi đồ thị, bạn có thể làm một cái gì đó như thế này ...

# Some vector of upper bounds for each plot which you can determine beforehand 
ul <- c(20,25,30,35) 
# Layout for printing plots (obviously you can handle this part however you like, this is just an example) 
vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y) 

# Make some sensible number of rows/columns for plot page 
x <- floor(sqrt(length(ul))) 
y <- ceiling(length(ul)/x) 

# Make list to hold plots 
plots <- as.list(1:length(ul)) 
dim(plots) <- c(x , y) 


# Store plots with variable upper limit variable each time 
for(i in plots){ 
     plots[[i]] <- ggplot(mtcars, aes(wt, mpg)) + geom_point() + scale_y_continuous(limits = c(15,ul[i]) , expand = c(0 , 0)) 
} 


# Print the plots 
grid.newpage() 
pushViewport(viewport(layout = grid.layout(x, y))) 
for(i in 1:x){ 
    for(j in 1:y){ 
     print(plots[[ i , j ]] , vp = vplayout(i , j)) 
     } 
    } 

enter image description here

+0

@jslefche Đây có phải là điều bạn đang hy vọng làm không? –