2011-08-25 28 views
30

Tôi muốn tạo một cốt truyện trong đó một trong các giá trị lớn hơn tất cả các giá trị khác. Có cách nào để có trục y gián đoạn không? Dữ liệu của tôi là như sau:Sử dụng ggplot2, tôi có thể chèn dấu ngắt trong trục không?

df <- data.frame(a = c(1,2,3,500), b = c('a1', 'a2','a3', 'a4')) 

p <- ggplot(data = df, aes(x = b, y = a)) + geom_bar() 
p <- p + opts(axis.text.x=theme_text(angle= 90, hjust=1)) + coord_flip() 
p 

enter image description here

Có cách nào mà tôi có thể làm cho chạy trục của tôi từ 1- 10, sau đó 490-500? Tôi không thể nghĩ ra bất kỳ cách nào khác để vẽ sơ đồ dữ liệu (ngoài việc chuyển đổi nó, mà tôi không muốn làm)

+3

tôi không nghĩ rằng bạn có thể giới thiệu vỡ trong ggplot2. một giải pháp thay thế là sử dụng thang đo 'log' để làm cho biểu đồ dễ đọc hơn. – Ramnath

+0

Tôi nhận ra nó sẽ dễ đọc hơn trên thang điểm, nhưng tôi không muốn hiển thị thông tin theo cách này, vì có sự thay đổi đáng kể giữa các giá trị nhỏ sẽ bị ẩn khi chúng được chuyển đổi. – djq

+3

về sự kết hợp của 'facet_wrap()' với 'scale =" free_x "' – Chase

Trả lời

30

Như đã lưu ý ở nơi khác, đây không phải là điều mà ggplot2 sẽ xử lý tốt, vì các trục bị hỏng thường được coi là có vấn đề.

Các chiến lược khác thường được coi là giải pháp tốt hơn cho vấn đề này. Brian đã đề cập một vài (faceting, hai lô tập trung vào các bộ giá trị khác nhau). Một lựa chọn khác mà mọi người thường bỏ qua quá, đặc biệt đối với barcharts, là để thực hiện một bảng :

enter image description here

Nhìn vào giá trị thực tế, 500 không che khuất sự khác biệt trong các giá trị khác! Đối với một số lý do bảng không nhận được đủ sự tôn trọng như dữ liệu một kỹ thuật trực quan hóa. Bạn có thể phản đối rằng dữ liệu của bạn có nhiều, nhiều danh mục trở nên khó sử dụng trong một bảng. Nếu có, có khả năng là biểu đồ thanh của bạn cũng sẽ có quá nhiều thanh hợp lý.

Và tôi không tranh luận về các bảng tất cả thời gian. Nhưng họ chắc chắn là một cái gì đó để xem xét nếu bạn đang làm cho barcharts với tương đối ít thanh. Và nếu bạn đang làm cho barcharts với tấn thanh, bạn có thể cần phải suy nghĩ lại rằng anyway.

Cuối cùng, cũng có chức năng axis.break trong gói plotrix thực hiện các trục bị hỏng. Tuy nhiên, từ những gì tôi thu thập, bạn sẽ phải tự xác định nhãn và vị trí trục, bằng tay.

+0

Joran, tôi có cảm giác lẫn lộn về việc sử dụng loại cốt truyện này. Bạn đúng - một bảng có lẽ là cách tốt nhất để hiển thị điều này. – djq

+0

@celenius - Tôi không có ý muốn rao giảng hay giống như tôi đang la mắng bạn. Tôi chỉ cảm thấy như những cái bàn không nhận được nhiều tình yêu, và đôi khi tôi làm việc về nó. ;) – joran

+0

Tôi không cảm thấy mắng! Nó chỉ không xảy ra với tôi để sử dụng một ... – djq

21

Không, không sử dụng ggplot. Xem các cuộc thảo luận trong chủ đề tại http://groups.google.com/group/ggplot2/browse_thread/thread/8d2acbfc59d2f247 nơi Hadley giải thích lý do tại sao nó không phải là có thể, nhưng đưa ra một thay thế được đề xuất (các ô mặt, một với tất cả các dữ liệu, một phóng to trong một khu vực cụ thể).

1

Tôi nghi ngờ có bất kỳ thứ gì ở giá trong R, nhưng bạn có thể hiển thị dữ liệu dưới dạng một loạt các hình khối 3D. 500 chỉ là 5 * 10 * 10, vì vậy nó sẽ mở rộng tốt. Giá trị chính xác có thể là nhãn.

Điều này có lẽ chỉ nên được sử dụng nếu bạn phải có đại diện đồ họa vì một số lý do.

19

Không phải với ggplot, nhưng với plotrix bạn có thể dễ dàng làm điều đó:

library(plotrix) 
gap.barplot(df$a, gap=c(5,495),horiz=T) 
5

Không, tiếc là không

Sự sợ hãi là cho phép các trục liên tục sẽ dẫn đến sự lừa dối của khán giả. Tuy nhiên, có trường hợp không có trục không liên tục dẫn đến biến dạng.Ví dụ, nếu trục bị cắt ngắn, nhưng thường nằm trong một khoảng thời gian nào đó (nói [0,1]), thì khán giả có thể không chú ý đến việc cắt ngắn và đưa ra các kết luận méo mó về dữ liệu. Trong trường hợp này, một trục không liên tục rõ ràng sẽ phù hợp và minh bạch hơn.

Hãy so sánh:

Example of good use of continuous vs discontinuous axis

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