2009-08-25 45 views
420

Tôi có cốt truyện nơi trục x là một yếu tố có nhãn dài. Mặc dù có lẽ không phải là một hình ảnh lý tưởng, bây giờ tôi chỉ muốn xoay các nhãn này thành dọc. Tôi đã tìm ra phần này với mã bên dưới, nhưng như bạn có thể thấy, các nhãn không hoàn toàn hiển thị.Nhãn trục xoay và khoảng cách trong ggplot2

data(diamonds) 
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut)) 
q <- qplot(cut,carat,data=diamonds,geom="boxplot") 
q + opts(axis.text.x=theme_text(angle=-90)) 

enter image description here

Trả lời

678

Thay đổi dòng cuối cùng để

q + theme(axis.text.x = element_text(angle = 90, hjust = 1)) 

Theo mặc định, các trục thẳng hàng ở trung tâm của các văn bản, ngay cả khi xoay. Khi bạn xoay +/- 90 độ, bạn thường muốn nó được sắp xếp ở rìa thay vì:

alt text

Những hình ảnh trên là từ this blog post.

+80

Trong phiên bản mới nhất của ggplot2, lệnh sẽ là: 'q + chủ đề (axis.text.x = element_text (angle = -90, hjust = 0))' – rnorberg

+0

'element_text' không còn tồn tại, trừ khi nó không có trong gói ggplot2 ... – naught101

+38

Đối với những người không hoạt động như mô tả ở đây, hãy thử 'theme (axis.text.x = element_text (angle = 90, vjust = 0.5))'. Theo ggplot2 0.9.3.1, điều này có vẻ là giải pháp. – lilster

57

Để thực hiện các văn bản trên nhãn đánh dấu hoàn toàn có thể nhìn thấy và đọc theo hướng tương tự như nhãn trục y, thay đổi dòng cuối cùng để

q + theme(axis.text.x=element_text(angle=90, hjust=1)) 
+1

Bây giờ phải là: '' opts'' ---> '' chủ đề'' và '' theme_text'' ---> '' element_text'' – PatrickT

15

tôi muốn cung cấp một giải pháp thay thế, một giải pháp mạnh mẽ tương tự như những gì tôi sắp đề xuất được yêu cầu trong phiên bản mới nhất của ggtern, kể từ khi giới thiệu tính năng xoay khung hình. Về cơ bản, bạn cần phải xác định vị trí tương đối bằng cách sử dụng lượng giác, bằng cách xây dựng một hàm trả về đối tượng element_text, cho góc (tức là độ) và vị trí (tức là một trong x, y, trên hoặc bên phải).

#Load Required Libraries 
library(ggplot2) 
library(gridExtra) 

#Build Function to Return Element Text Object 
rotatedAxisElementText = function(angle,position='x'){ 
    angle  = angle[1]; 
    position = position[1] 
    positions = list(x=0,y=90,top=180,right=270) 
    if(!position %in% names(positions)) 
    stop(sprintf("'position' must be one of [%s]",paste(names(positions),collapse=", ")),call.=FALSE) 
    if(!is.numeric(angle)) 
    stop("'angle' must be numeric",call.=FALSE) 
    rads = (angle - positions[[ position ]])*pi/180 
    hjust = 0.5*(1 - sin(rads)) 
    vjust = 0.5*(1 + cos(rads)) 
    element_text(angle=angle,vjust=vjust,hjust=hjust) 
} 

Thành thật mà nói, theo ý kiến ​​của tôi, tôi nghĩ rằng một tùy chọn 'auto' nên được cung cấp trong ggplot2 cho hjustvjust lập luận, khi xác định góc, dù sao, cho phép thể hiện cách thức hoạt động trên.

#Demonstrate Usage for a Variety of Rotations 
df = data.frame(x=0.5,y=0.5) 
plots = lapply(seq(0,90,length.out=4),function(a){ 
    ggplot(df,aes(x,y)) + 
    geom_point() + 
    theme(axis.text.x = rotatedAxisElementText(a,'x'), 
      axis.text.y = rotatedAxisElementText(a,'y')) + 
    labs(title = sprintf("Rotated %s",a)) 
}) 
grid.arrange(grobs=plots) 

nào sản xuất như sau:

Example

+1

Tôi không nhận được cùng một kết quả, đối với tôi, văn bản trục không bao giờ được điều chỉnh tốt bằng phương pháp tự động của bạn. Tuy nhiên, bằng cách sử dụng 'rads = (-angle - positions [[position]]) * pi/180' tạo ra các vị trí tốt hơn. Lưu ý dấu trừ bổ sung trước góc. Cảm ơn bạn đã viết mã :) –

16

Sử dụng + coord_flip().

Trong "R cho khoa học dữ liệu", Wickham và Grolemund nói về vấn đề chính xác này. Trong chương 3.8, Chức Adjustments, họ viết:

coord_flip() chuyển trục x và y. Điều này rất hữu ích (ví dụ), nếu bạn muốn các ô nằm ngang. Nó cũng hữu ích cho các nhãn dài: rất khó để có được chúng phù hợp mà không chồng chéo lên trục x.

Áp dụng điều này để âm mưu của bạn, chúng tôi chỉ cần thêm + coord_flip() đến ggplot:

data(diamonds) 
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut)) 

qplot(cut,carat,data = diamonds, geom = "boxplot") + 
    coord_flip() 

enter image description here

Và bây giờ là danh hiệu siêu dài đang theo chiều ngang trải ra và rất dễ dàng để đọc!

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