2013-03-11 73 views
23

Trong thế giới nghiên cứu thực sự của tôi, nó rất phổ biến để hiển thị trục x ở trên cùng (hoặc cả trên cùng và dưới) và trục y ở bên phải. Tuy nhiên, các vị trí mặc định là x ở phía dưới và y ở bên trái trong ggplot2.Làm thế nào để thay đổi vị trí của trục x và y trong ggplot2

Sau Kohske Post Here, các lệnh được sử dụng là:

x <- seq(0, 10, 0.1) 
y <- sin(x * pi) 
qplot(x, y, geom = "line") + 
scale_x_continuous(guide = guide_axis(position = "top")) + 
scale_y_continuous(guide = guide_axis(position = "right")) 

Tôi đã thử lệnh trong dev-mode trên:

install_packages("devtools") 
library(devtools) 
dev_mode() 
install_github("ggplot2", "kohske", "feature/pguide") 
library(ggplot2) 

Thật không may, nó đã không làm việc tốt với các plyr gói mới nhất. Tin nhắn:

The following 'from' values not present in 'x': col, color, pch, cex, lty, lwd, srt, adj, bg, fg, min, max... 
Error in plyr:::split_indices(seq_len(nrow(data)), scale_id, n) 

Sau đó, tôi đã cố gắng codes from github directedly, các thông điệp là:

Error in continuous_scale(c("x", "xmin", "xmax", "xend", "xintercept"), : 
    formal argument "guide" matched by multiple actual arguments 

tôi đã nhận thấy rằng Hadley cho biết chức năng này nằm trong danh sách công việc phải làm của mình. Tuy nhiên, tôi không thể tìm thấy một giải pháp tại thời điểm này. Bất cứ ai có thể giúp đỡ?

Trả lời

8

giải pháp ggplot2

Tôi chấp nhận This solution để tạo ra một trục y ngay. Cá nhân tôi tìm thấy thao tác grobs sử dụng trong một gtable thực sự khó khăn. Tôi từ bỏ trục x nhưng tôi đưa ra một giải pháp mạng. Tôi hy vọng chức năng này sẽ được triển khai trong ggplot2 càng sớm càng tốt.

library(ggplot2) 
library(gtable) 
library(grid) 
grid.newpage() 
dat <- data.frame(x<-seq(0, 10, 0.1),y = sin(x * pi)) 
p <- ggplot(dat, aes(x, y)) + geom_line(colour = "blue") + theme_bw() 
# extract gtable 
g <- ggplot_gtable(ggplot_build(p)) 

# axis tweaks 
ia <- which(g$layout$name == "axis-l") 
ax <- g$grobs[[ia]]$children[[2]] 
ax$widths <- rev(ax$widths) 
ax$grobs <- rev(ax$grobs) 
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm") 
pp <- c(subset(g$layout, name == "panel", select = t:r)) 
g <- gtable_add_cols(g, g$widths[g$layout[ia, ]$l], length(g$widths) - 1) 
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b) 
g$grobs[[ia]]$children[[2]] <- NULL 
############################## 
ia <- which(g$layout$name == "ylab") 
ylab <- g$grobs[[ia]] 
g <- gtable_add_cols(g, g$widths[g$layout[ia, ]$l], length(g$widths) - 1) 
g <- gtable_add_grob(g, ylab, pp$t, length(g$widths) - 1, pp$b) 
g$grobs[[ia]]$label = '' 
grid.draw(g) 

enter image description here

giải pháp mạng

Đây không phải là một giải pháp ggplot2, nhưng lattice một. Sử dụng latticeExtra với chủ đề ggplot2, chúng tôi có thể có giao diện tương tự với hành vi mong muốn.

library(latticeExtra) 
xyplot(y~ x, type='l', scales=list(x=list(alternating=2), 
            y=list(alternating=2)), 
     par.settings = ggplot2like(),axis=axis.grid) 

enter image description here

+4

“Tôi hy vọng chức năng này sẽ được thực hiện trong ggplot2 càng sớm càng tốt ”- không thể đồng ý hơn. Và tôi cũng nghĩ rằng việc sử dụng phương pháp gtable là khá khó khăn. Hơn nữa, có cách nào để sử dụng "viewport" phương pháp (thay vì grid.draw) để sắp xếp một số lô với trục y phải không? – bearcat

+0

@bearcat Để sắp xếp một số ô, tốt hơn nên sử dụng một cái gì đó như 'thư viện (gridExtra); grid.arrange (g, g)'. Nhưng cố gắng sử dụng gói 'Lattice', chắc chắn có một đường cong học tập, nhưng nó là một gói tuyệt vời và được ghi chép đầy đủ. – agstudy

+0

Tôi tin rằng phương pháp "chế độ xem" có hiệu suất tốt hơn để sử dụng cụ thể - ví dụ: khi cố gắng loại bỏ các ô phụ trùng lặp. Xin lỗi, tôi chỉ đang chờ giải pháp rõ ràng và dễ sử dụng hơn. – bearcat

8

Từ ggplot 2.2.0 bạn có thể thiết lập vị trí của trục với lập luận position trong scale_:

ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    scale_x_continuous(position = "top") + 
    scale_y_continuous(position = "right") 

enter image description here

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