2012-04-28 39 views
10

Tôi muốn biết cách tạo một ô trong R khi trục y được đảo ngược sao cho dữ liệu được vẽ sẽ xuất hiện ở góc phần tư thứ tư (IV) của một mặt phẳng Descartes, trái ngược với phần tư đầu tiên (I).Cách đảo trục y trên ô

Để tham khảo, cốt truyện tôi đang cố gắng để làm cho trông rất tương tự như sau (source):

a plot with inverted y-axis

Tôi đã tìm thấy một số câu hỏi trực tuyến liên quan đến đảo ngược đánh số trên trục y, nhưng tất cả vẫn vẽ dữ liệu trong góc phần tư đầu tiên. Bất cứ ai có thể đề nghị làm thế nào tôi có thể sản xuất một âm mưu tương tự như được hiển thị ở trên?

+1

trong cuộc gọi âm mưu của bạn , chỉ định 'axes = FALSE', và sau đó sử dụng' axis() 'một vài lần, xác định đối số' side' để lấy trục của bạn, nơi bạn muốn t hem. –

+3

Tôi sẽ bình luận của tim lần thứ hai: nó không giống như bạn đang thực sự "đảo ngược" bất cứ điều gì. Bạn chỉ vẽ sơ đồ trục x trên đầu chứ không phải ở phía dưới. – joran

Trả lời

10

Chỉ cần để cung cấp một câu trả lời làm việc ra, theo ý kiến ​​của @timriffe và @joran ...

Sử dụng chức năng log nhỏ ticks từ this answer:

minor.ticks.axis <- function(ax,n,t.ratio=0.5,mn,mx,...){ 

    lims <- par("usr") 
    if(ax %in%c(1,3)) lims <- lims[1:2] else lims[3:4] 

    major.ticks <- pretty(lims,n=5) 
    if(missing(mn)) mn <- min(major.ticks) 
    if(missing(mx)) mx <- max(major.ticks) 

    major.ticks <- major.ticks[major.ticks >= mn & major.ticks <= mx] 

    labels <- sapply(major.ticks,function(i) 
    as.expression(bquote(10^ .(i))) 
        ) 
    axis(ax,at=major.ticks,labels=labels,...) 

    n <- n+2 
    minors <- log10(pretty(10^major.ticks[1:2],n))-major.ticks[1] 
    minors <- minors[-c(1,n)] 

    minor.ticks = c(outer(minors,major.ticks,`+`)) 
    minor.ticks <- minor.ticks[minor.ticks > mn & minor.ticks < mx] 


    axis(ax,at=minor.ticks,tcl=par("tcl")*t.ratio,labels=FALSE) 

} 

Làm cho một số dữ liệu ví dụ tái sản xuất :

x <- 1:8 
y <- 10^(sort(runif(8, 1, 10), decreasing = TRUE)) 

Lô mà không trục:

plot(x, log10(y), # function to plot 
xlab="",   # suppress x labels 
type = 'l',  # specify line graph 
xlim = c(min(x), (max(x)*1.3)), # extend axis limits to give space for text annotation 
ylim = c(0, max(log10(y))),  # ditto 
axes = FALSE) # suppress both axes 

Thêm trục log ưa thích và biến nhãn đánh dấu đúng con đường lên (nhờ @joran!):

minor.ticks.axis(2, 9, mn=0, mx=10, las=1) 

Thêm trục x lên phía trên:

axis(3) 

Thêm nhãn trục x (thanks for the tip, @WojciechSobala)

mtext("x", side = 3, line = 2) 

Và thêm một chú thích vào cuối dòng

0.123.
text(max(x), min(log10(y)), "Example", pos = 1) 

Dưới đây là kết quả:

enter image description here

+1

+1 Được thực hiện tốt. Bạn không cần phải tải lên một hình ảnh khác để chứng minh nó, nhưng vì OP chắc chắn sẽ hỏi, không chuyển 'las = 1' thành' minor.ticks.axis' để xoay các nhãn trục y thành ngang? – joran

+0

@joran, ý tưởng hay, đã hoàn tất! – Ben

+1

Với mtext, bạn có thể thêm nhãn trục x để có được kết quả mong muốn. –

1

Trả lời câu hỏi ở tiêu đề,/Cách dễ nhất tốt nhất để đảo ngược trục là để lật limit biến xung quanh:

> plot(1:10, xlim=c(1,10)); 

standard plot

> plot(1:10, xlim=c(10,1)); 

plot with inverted X axis

> plot(1:10, ylim=c(10,1)); 

plot with inverted Y axis

Làm theo cách này có nghĩa là bạn không cần phải mess xung quanh với trục đó là khác biệt so với tọa độ hình ảnh.

này có thể được kết hợp với 'xaxt = 'n'' tham số và thêm axis lệnh để đặt một trục đứng về phía khác:

> plot(1:10, ylim=c(10,1), xaxt="n"); axis(3); 

Inverted graph with X axis on top

0

Nó bây giờ khá dễ dàng để đảo ngược trục y bằng scale_y_reverse và chỉ định position = "top" cho trục x trong ggplot2

Ví dụ

library(ggplot2) 
library(scales) 

set.seed(99) 
Date <- seq(from = as.Date("2017-12-01"), to = as.Date("2017-12-15"), 
      by = "days") 
Flux <- runif(length(Date), 1, 10000) 
Flux_df <- data.frame(Date, Flux) 

p1 <- ggplot(Flux_df, aes(Date, Flux)) + 
    geom_col() + 
    xlab("") + 
    scale_x_date(position = "top", breaks = pretty_breaks(), expand = c(0, 0)) + 
    scale_y_reverse(expand = expand_scale(mult = c(0.2, 0))) + 
    theme_bw(base_size = 16) + 
    theme(panel.border = element_blank(), 
     panel.grid.major.x = element_blank(), 
     panel.grid.minor = element_blank(), 
     axis.line = element_line()) + 
    theme(legend.position = "none") 
p1 

enter image description here

Nếu chúng ta muốn cả hai trục logarit và đảo ngược, chúng ta cần một cách giải quyết đề nghị here như ggplot2 không có lựa chọn atm

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


p1 + scale_y_continuous(trans = reverselog_trans(10), 
         breaks = scales::trans_breaks("log10", function(x) 10^x), 
         labels = scales::trans_format("log10", scales::math_format(10^.x)), 
         expand = expand_scale(mult = c(0.2, 0))) + 
    annotation_logticks() 

enter image description here

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