2012-07-20 31 views
22

Tôi có một khung dữ liệu chụp một số biện pháp theo thời gian mà tôi muốn hình dung một khía cạnh 3x1. Tuy nhiên, mỗi phép đo chứa các đơn vị/thang đo khác nhau sẽ được hưởng lợi từ các phép biến đổi tùy chỉnh và các lược đồ ghi nhãn. Vì vậy, câu hỏi của tôi là: Nếu đơn vị và tỷ lệ khác nhau trên các khía cạnh khác nhau, làm cách nào tôi có thể chỉ định trình định dạng tùy chỉnh hoặc phép biến đổi (tức là log10) cho một trục cụ thể trong một khía cạnh?Định dạng nhãn trục khác nhau trên mỗi khía cạnh trong ggplot/R

Ví dụ, giả sử tôi có dữ liệu:

df = data.frame(dollars=10^rlnorm(50,0,1), counts=rpois(50, 100)) 
melted.df = melt(df, measure.var=c("dollars", "counts")) 

Làm thế nào người ta sẽ đi sau khi thiết lập một khía cạnh 2x1 cho thấy đô la và đếm trên bảng xếp hạng với labels=dollarsscale_y_continuous(trans = "log10", ...) cho dữ liệu df$dollars?

Cảm ơn bạn!

+0

không dễ, tôi nghĩ ... –

+0

Vâng. Shucks. Tôi vừa xem qua liên kết này, nơi ai đó gặp sự cố tương tự: http://comments.gmane.org/gmane.comp.lang.r.ggplot2/4496. –

+0

Có lẽ dễ dàng hơn để thực hiện hai ô riêng biệt và sắp xếp chúng lại với nhau. –

Trả lời

40

Khi bạn phát hiện ra, không có giải pháp dễ dàng cho điều này, nhưng nó xuất hiện rất nhiều. Vì loại điều này được hỏi thường xuyên như vậy, tôi thấy hữu ích khi giải thích lý do tại sao điều này rất khó và đề xuất giải pháp tiềm năng.

Kinh nghiệm của tôi đã được rằng người đến ggplot2 hoặc mạng đồ họa hiểu lầm cơ bản mục đích của faceting (hoặc trellising, trong lưới). Tính năng này được phát triển với ý tưởng rất cụ thể trong tâm trí: hình ảnh hóa dữ liệu trên nhiều nhóm mà chia sẻ thang tỷ lệ chung. Nó xuất phát từ một cái gì đó gọi là nguyên tắc của bội số nhỏ, được tán thưởng bởi Tufte và những người khác.

Đặt các bảng cạnh nhau với các thang rất khác nhau là điều mà các chuyên gia thiết kế trực quan sẽ có xu hướng tránh, vì nó có thể gây hiểu lầm tốt nhất. (Tôi không mắng bạn ở đây, chỉ giải thích lý do ...)

Nhưng tất nhiên, một khi bạn có công cụ tuyệt vời này, bạn không bao giờ biết cách mọi người sẽ sử dụng nó. Vì vậy, nó được kéo dài: các yêu cầu đi vào cho khả năng cho phép các quy mô để thay đổi theo bảng điều khiển, và để thiết lập các khía cạnh khác nhau của cốt truyện riêng cho mỗi bảng. Và do đó, việc có mặt trong ggplot2 đã được mở rộng vượt ra ngoài mục đích ban đầu của nó.

Một hệ quả của việc này là một số điều khó thực hiện đơn giản chỉ vì mục đích thiết kế ban đầu của đối tượng địa lý. Đây có thể là một ví dụ như vậy.

Ok, giải thích đầy đủ. Đây là giải pháp của tôi.

Bí quyết ở đây là để nhận ra rằng bạn không vẽ biểu đồ có cùng tỷ lệ. Đối với tôi, điều đó có nghĩa là bạn thậm chí không nên nghĩ đến việc sử dụng faceting. Thay vào đó, hãy từng lô riêng biệt, và sắp xếp chúng lại với nhau trong một cốt truyện:

library(gridExtra) 

p1 <- ggplot(subset(melted.df,variable == 'dollars'), 
       aes(x = value)) + 
      facet_wrap(~variable) + 
      geom_density() + 
      scale_x_log10(labels = dollar_format()) 

p2 <- ggplot(subset(melted.df,variable == 'counts'), 
       aes(x = value)) + 
      facet_wrap(~variable) + 
      geom_density() 

grid.arrange(p1,p2) 

enter image description here

Tôi vừa mới đoán vào những gì geom_* bạn muốn sử dụng, và tôi chắc chắn điều này là không thực sự những gì bạn muốn âm mưu, nhưng ít nhất nó minh họa nguyên tắc.

+0

Cảm ơn bạn đã phản hồi sâu sắc! Tôi hoàn toàn hiểu được ý nghĩa của việc đi lạc khỏi các ý định thiết kế ban đầu cho ggplot2. Nói một cách thực tế, tôi có hai bộ dữ liệu trong đó một bộ dữ liệu theo phân phối bình thường trong khi bản kia tuân theo phân phối log-normal, vì vậy tôi hy vọng có thể so sánh dữ liệu được chuẩn hóa trực quan theo thời gian. Bạn có bất kỳ thông tin chi tiết nào về cách căn chỉnh đúng các khu vực ô không? Tôi đã đi qua các thư viện 'ggExtra' trước đây, được cho là cung cấp một số hỗ trợ đặc biệt cho điều đó, nhưng tôi đánh giá cao bất kỳ hướng nào với điều đó. –

+0

@StefanNovak Tôi rất vui vì nó rất hữu ích! Tôi muốn nhấn mạnh một lần nữa rằng tôi đã không chỉ trích lựa chọn thiết kế của bạn. Một nguyên tắc của câu hỏi SO là họ "sống mãi mãi" và vì vậy sẽ giúp phục vụ nhiều hơn chỉ là người hỏi ban đầu. Như tôi đã nói, điều này xuất hiện hết lần này đến lần khác, vì vậy lời giải thích của tôi hướng đến người đọc trong tương lai nhiều hơn bạn. – joran

+1

@StefanNovak Vâng, cách hacky để làm điều đó là điều chỉnh các nhãn đánh dấu trục sao cho chúng có cùng số chữ số, ngay cả khi điều đó có nghĩa là đệm nhãn với khoảng trắng. Tôi chắc chắn rằng đó là yêu cầu trước khi quá ... Tôi sẽ xem nếu tôi có thể tìm thấy bất cứ điều gì relavent. – joran

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