Nhãn xoay và khoảng cách trục trong ggplot2


667

Tôi có một âm mưu trong đó 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 trực quan lý tưởng, như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ị.

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))

nhập mô tả hình ảnh ở đây

Câu trả lời:


1107

Thay đổi dòng cuối cùng thành

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

Theo mặc định, các trục được căn chỉnh ở giữa văn bản, ngay cả khi xoay. Khi bạn xoay +/- 90 độ, bạn thường muốn nó được căn chỉnh ở cạnh thay thế:

văn bản thay thế

Hình ảnh trên là từ bài viết trên blog này .


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

55
Đối với những người mà sự công bằng không hành xử như được mô tả ở đây, hãy thử theme(axis.text.x=element_text(angle = 90, vjust = 0.5)). Kể từ ggplot2 0.9.3.1, đây dường như là giải pháp.
lilster

42
Trên thực tế, tôi đã phải kết hợp hai giải pháp ở trên để có được các nhãn được căn chỉnh chính xác:q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
jupp0r

32
@ jupp0r đúng. theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))LÀ MỘT CÔNG VIỆC HIỆN TẠI.

51
nếu bạn muốn nhãn xoay 45 ° (dễ đọc hơn) theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))sẽ cho kết quả tốt
jan-glx

88

Để làm cho văn bản trên nhãn đánh dấu hiển thị đầy đủ và đọc theo cùng hướng với nhãn trục y, hãy thay đổi dòng cuối cùng thành

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

81

Sử dụng coord_flip()

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

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

nhập mô tả hình ảnh ở đây


Trong Ch 3.9 của R cho Khoa học dữ liệu , Wickham và Grolemund nói về câu hỏi chính xác này:

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


26

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 canvas.

Về cơ bản, bạn cần xác định các vị trí tương đối bằng cách sử dụng lượng giác, bằng cách xây dựng hàm trả về một element_textđối tượng, góc đã cho (nghĩa là độ) và định vị (tức là một trong các thông tin x, y, trên cùng 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 tôi, tôi nghĩ rằng nên có sẵn tùy chọn 'tự động' ggplot2cho các đối số hjustvjustđối số, khi chỉ định góc, dù sao đi nữa, hãy cho thấy 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)

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

Thí dụ


1
Tôi không thu được kết quả tương tự, đố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, sử dụng các rads = (-angle - positions[[ position ]])*pi/180vị trí được sản xuất tốt hơn. Lưu ý dấu trừ bổ sung trước góc. Dù sao cũng cảm ơn về mã :)
asac

7

Các ggpubr gói Mời một phím tắt mà không đúng theo mặc định (văn bản class phải, hộp văn bản giữa align để đánh dấu):

library(ggplot2)
diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))
q <- qplot(cut, carat, data = diamonds, geom = "boxplot")
q + ggpubr::rotate_x_text()

Được tạo vào ngày 2018-11-06 bởi gói reprex (v0.2.1)

Được tìm thấy với tìm kiếm GitHub cho các tên đối số có liên quan: https://github.com/search?l=R&q=element tựa + angle + 90+vjust +org% 3Acran & type = Code


5

Ngoài ra, ggplot 3.3.0cung cấp guide_axis(n.dodge = 2)(như guideđối số scale_..hoặc hoặc là xđối số guides) để khắc phục vấn đề âm mưu quá mức bằng cách tránh các nhãn theo chiều dọc. Nó hoạt động khá tốt trong trường hợp này:

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

ggplot(diamonds, aes(cut, carat)) + 
  geom_boxplot() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  NULL


1

Để có được nhãn x tick có thể đọc mà không cần phụ thuộc bổ sung, bạn muốn sử dụng:

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

Thao tác này xoay các nhãn đánh dấu 90 ° ngược chiều kim đồng hồ và căn chỉnh chúng theo chiều dọc ở cuối ( hjust = 1) và tâm của chúng theo chiều ngang với dấu tick tương ứng ( vjust = 0.5).

Ví dụ đầy đủ:

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))


Lưu ý, mà dọc / thông số biện minh ngang vjust/ hjustcủa element_textcó liên quan đến văn bản. Do đó, vjustchịu trách nhiệm cho sự liên kết ngang .

Nếu không có vjust = 0.5nó sẽ như thế này:

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

Nếu không có hjust = 1nó sẽ như thế này:

q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

Nếu vì lý do nào đó (có dây) bạn muốn xoay nhãn tick 90 ° theo chiều kim đồng hồ (sao cho chúng có thể được đọc từ bên trái), bạn sẽ cần sử dụng : q + theme(axis.text.x = element_text(angle = -90, vjust = 0.5, hjust = -1)).

Tất cả điều này đã được thảo luận trong các bình luận của câu trả lời này nhưng tôi thường xuyên quay lại câu hỏi này, rằng tôi muốn một câu trả lời mà tôi chỉ có thể sao chép mà không cần đọc các bình luận.


0

Một thay thế cho coord_flip()là sử dụng ggstancegói. Ưu điểm là nó giúp việc kết hợp các biểu đồ với các loại biểu đồ khác dễ dàng hơn và quan trọng hơn là bạn có thể đặt tỷ lệ tỷ lệ cố định cho hệ tọa độ của mình .

library(ggplot2)
library(ggstance)

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

ggplot(data=diamonds, aes(carat, cut)) + geom_boxploth()

Được tạo vào ngày 2020-03-11 bởi gói reprex (v0.3.0)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.