2012-06-15 30 views
26

Tôi muốn làm cho một âm mưu với một đảo ngược, log10 x quy mô sử dụng ggplot2:Làm thế nào để có được một quy mô đảo ngược, log10 trong ggplot2?

require(ggplot2) 
df <- data.frame(x=1:10, y=runif(10)) 
p <- ggplot(data=df, aes(x=x, y=y)) + geom_point() 

Tuy nhiên, có vẻ như tôi có thể hoặc một quy mô log10 hoặc một quy mô đảo ngược:

p + scale_x_reverse() + scale_x_log10() 

log10 scale, but not reversed

p + scale_x_reverse() 

reversed scale, but not log10

Tôi đoán điều này là hợp lý, nếu một lớp chỉ có thể có một tỷ lệ. Và chắc chắn tôi có thể hack nó bằng cách làm biến log trên dataframe bản thân mình, df$xLog <- log10(df$x) nhưng giải pháp đó có vẻ trái ngược với tinh thần của ggplot. Có cách nào để có được loại âm mưu này mà không làm biến đổi dữ liệu bên ngoài cuộc gọi ggplot không?

+2

tôi mong đợi này để làm việc là tốt, nhưng dường như một chút của nó phức tạp. Có [workgroup] (https://groups.google.com/forum/?fromgroups#!searchin/ggplot2/reverse$20log$20scale/ggplot2/AfMf9L9y9fc/Qu-FnJLJaagJ) dường như bị hỏng trong phiên bản mới nhất. Nếu @kohske hoặc ai đó không thể tìm ra giải pháp khác, có thể tạo một yêu cầu tính năng tốt. – joran

Trả lời

43

Liên kết mà @joran đưa ra trong nhận xét của ông đưa ra ý tưởng đúng (xây dựng biến đổi của riêng bạn), nhưng đã lỗi thời đối với gói scales mới ggplot2 sử dụng ngay bây giờ. Nhìn vào log_transreverse_trans trong gói quy mô để được hướng dẫn và cảm hứng, một hàm reverselog_trans thể được thực hiện:

library("scales") 
reverselog_trans <- function(base = exp(1)) { 
    trans <- function(x) -log(x, base) 
    inv <- function(x) base^(-x) 
    trans_new(paste0("reverselog-", format(base)), trans, inv, 
       log_breaks(base = base), 
       domain = c(1e-100, Inf)) 
} 

Điều này có thể được sử dụng đơn giản như:

p + scale_x_continuous(trans=reverselog_trans(10)) 

mang đến cho cốt truyện:

enter image description here

Sử dụng bộ dữ liệu hơi khác để hiển thị rằng trục chắc chắn đảo ngược:

DF <- data.frame(x=1:10, y=1:10) 
ggplot(DF, aes(x=x,y=y)) + 
    geom_point() + 
    scale_x_continuous(trans=reverselog_trans(10)) 

enter image description here

+0

Tôi sợ rằng giải pháp này không còn hoạt động: Lỗi trong reverselog_trans (10): không thể tìm thấy chức năng "trans_new" Thêm quy mô rõ ràng :: trans_new chỉ dẫn đến lỗi mới, chức năng quy mô dường như đã được cập nhật :( – Richard

+2

@Richard Tôi vừa kiểm tra nó và nó hoạt động, nhưng gói 'scales' phải được gắn vào đường dẫn tìm kiếm (' library ("scales") '). Điều đó không rõ ràng trong câu trả lời (và có thể không cần thiết tại –

+0

Thật dễ dàng huh ?! Cảm ơn bạn rất nhiều !! – Richard

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