2015-04-08 28 views
7

Với đoạn mã sau:ggplot2: Làm thế nào để trao đổi trục y và dải khía cạnh phải và làm thế nào để đặt hàng giá trị khía cạnh

library(ggplot2) 
set.seed(6809) 
diamonds <- diamonds[sample(nrow(diamonds), 1000), ] 
diamonds$cut <- factor(diamonds$cut, 
     levels = c("Ideal", "Very Good", "Fair", "Good", "Premium")) 

# Repeat first example with new order 
p <- ggplot(diamonds, aes(carat, ..density..)) + 
     geom_histogram(binwidth = 1) 
p + facet_grid(color ~ cut) 

tôi có thể tạo ra các con số sau:

enter image description here

My câu hỏi là:

  1. Làm cách nào để sắp xếp đúng dải theo thứ tự mong muốn của tôi ví dụ. (G, F, D, E, I, J, H)?
  2. Làm cách nào để trao đổi dải đúng với trục y (mật độ)?
+1

(1) Tương tự như những gì bạn đã làm với cắt: xác định thứ tự của các mức độ yếu tố. (2) Bạn thực sự không thể thay đổi trực tiếp đối tượng lưới. – joran

Trả lời

10

Cập nhật cho ggplot2 2.2.1

Với ggplot2 phiên bản 2, bạn có thể chuyển đổi các vị trí của các nhãn trục và nhãn khía cạnh. Vì vậy, đây là cập nhật mã mà mất lợi thế của các tính năng này:

# Reorder factor levels 
diamonds$color = factor(diamonds$color, levels=c("G","F","D","E","I","J","H")) 

ggplot(diamonds, aes(carat, ..density..)) + 
    geom_histogram(binwidth=1) + 
    facet_grid(color ~ cut, switch="y") + # Put the y facet strips on the left 
    scale_y_continuous("density", position="right") + # Put the y-axis labels on the right 
    theme(strip.text.y=element_text(angle=180)) 

enter image description here

gốc trả lời

Như @joran nói, bạn phải thay đổi các đối tượng lưới nếu bạn muốn toàn quyền kiểm soát những gì đi đâu. Đó là đau đớn.

Đây là một cách tiếp cận khác vẫn là một rắc rối, nhưng dễ dàng hơn (ít nhất là đối với tôi) hơn là sửa đổi đối tượng lưới. Ý tưởng cơ bản là chúng tôi định hướng các nhãn khía cạnh và trục khác nhau sao cho chúng ta có thể xoay âm mưu 90 độ ngược chiều kim đồng hồ (để có được các nhãn khía cạnh ở bên trái) trong khi vẫn có tất cả các nhãn được định hướng đúng cách.

Để thực hiện việc này, bạn cần phải sửa đổi các đồ thị bằng nhiều cách: Lưu ý bổ sung của tôi của coord_flip, tất cả những thứ theme, và scale_x_reverse. Cũng lưu ý rằng tôi đã chuyển thứ tự của các biến thuộc tính, sao cho color bắt đầu ở trên cùng (nó sẽ ở bên trái sau khi chúng ta xoay biểu đồ).

# Reorder factor levels 
diamonds$color = factor(diamonds$color, levels=rev(c("G","F","D","E","I","J","H"))) 

p <- ggplot(diamonds, aes(carat, ..density..)) + 
    geom_histogram(binwidth = 1) + 
    facet_grid(cut ~ color) + coord_flip() + 
    theme(strip.text.x=element_text(angle=-90), 
     axis.text.y=element_text(angle=-90, vjust=0.5, hjust=0.5), 
     axis.text.x=element_text(angle=-90, vjust=0.5, hjust=0), 
     axis.title.x=element_text(angle=180), 
     axis.title.y=element_text(angle=-90)) + 
    scale_x_reverse() 

Một tùy chọn là lưu biểu đồ rồi xoay nó trong chương trình khác (chẳng hạn như Xem trước, nếu bạn đang sử dụng máy Mac). Tuy nhiên, với sự giúp đỡ của this SO answer, tôi đã có thể xoay cốt truyện trong R. Nó yêu cầu một số thử nghiệm và lỗi (với kiến ​​thức hạn chế của tôi về cách thao tác các đối tượng lưới) để có được kích thước phù hợp cho khung nhìn. Tôi đã lưu nó dưới dạng PNG để đăng trên SO, nhưng bạn có thể lưu nó dưới dạng PDF, trông đẹp hơn.

png("example.png", 500,600) 
pushViewport(viewport(width = unit(8, "inches"), height = unit(7, "inches"))) 
print(p, vp=viewport(angle=90)) 
dev.off() 

Và đây là kết quả:

enter image description here

2

facet_grid có thuộc tính "switch".

tắc: Theo mặc định, các nhãn được hiển thị ở phía trên và bên phải của cốt truyện. Nếu "x", các nhãn trên cùng sẽ được hiển thị ở dưới cùng.Nếu "y", các nhãn bên phải sẽ được hiển thị ở bên trái. Cũng có thể được đặt thành "cả hai".

manual here

facet_grid(cut ~ color, switch = "y") 
+0

Tính năng mới tuyệt vời, nhưng trục Y vẫn ở trên cùng một mặt, thật không may. – mkt

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