2011-08-11 28 views
35

Gần đây, một vài công dụng gọn gàng của ggplot2 đã đưa ra, và các giải pháp hoặc một phần hoặc toàn đã được đăng:Mở rộng ggplot2 đúng cách?

ggheat là đáng chú ý vì nó khá phá vỡ phép ẩn dụ ggplot bằng cách vẽ sơ đồ thay vì trả về một đối tượng.

Các giải pháp cú đúp xoăn là đáng chú ý vì không thực sự phù hợp với khái niệm cấp cao ggplot2 (ví dụ bạn nên chỉ định một loạt các điểm bạn muốn ngắt, và ở một nơi khác có thể xác định địa lý theo cách bạn muốn phạm vi hiển thị - cú đúp, hộp, bò màu tím, v.v.).

ggplot2 book (mà tôi sẽ đặt hàng sớm và đã đọc 2 chương trực tuyến) có vẻ là về cách sử dụng ngữ pháp và chức năng thay vì viết văn bản và chức năng thay vì viết văn bản mới hoặc mở rộng rộng rãi các ngôn ngữ hiện có.

Tôi muốn tìm hiểu cách thêm đối tượng địa lý cụ thể hoặc phát triển một geom mới và thực hiện đúng cách. ggplot2 có thể không được dùng như một gói đồ họa chung theo cùng cách mà grid hoặc đồ họa cơ sở, nhưng có rất nhiều đồ thị chỉ là một hoặc hai phần mở rộng từ một ggplot2 hiện có. Khi những tình huống này xuất hiện, tôi thường có thể đặt đủ các vật thể vào nhau để làm điều gì đó một lần, nhưng nếu tôi cần âm mưu tương tự vài chục lần thì sao? Điều gì xảy ra nếu những người khác thích nó và muốn sử dụng nó - bây giờ họ phải kludge thông qua cùng một quá trình mỗi khi họ muốn biểu đồ đó. Dường như với tôi rằng giải pháp thích hợp là thêm vào một stat_heatplotgeom_heatplot, hoặc để thêm một geom_Tuftebox cho Tufte box plots, v.v ... Tuy nhiên, tôi chưa bao giờ thấy một ví dụ về thực sự mở rộng ggplot2; chỉ là ví dụ về cách sử dụng nó.

Tài nguyên nào tồn tại để đào sâu hơn vào ggplot2 và bắt đầu mở rộng nó? Tôi đặc biệt quan tâm đến một cách cao cấp để xác định một phạm vi trên một trục như mô tả ở trên, nhưng kiến ​​thức chung về những gì làm cho ggplot2 đánh dấu được chào đón là tốt.

Không có hướng dẫn mạch lạc (ít khi tồn tại đối với việc nâng cấp đủ và do đó có thể không tồn tại ở đây), làm thế nào để tìm hiểu về nội bộ? Kiểm tra nguồn rõ ràng là một cách, nhưng những chức năng nào để bắt đầu, v.v.

+19

Rất tiếc, hàm 'makeMeHadley()' trong quá trình cài đặt R bị hỏng. Có lẽ nếu tôi đã thử 'make_me_hadley()' thay thế? –

+2

Tôi đã thêm một [trang danh sách yêu thích] (https://github.com/hadley/ggplot2/wiki/wishlist---feature-requests) vào wiki ggplot2 để liệt kê các ý tưởng khác nhau về tiện ích mở rộng. – baptiste

+1

@ AriB.Friedman: Đó có phải là mệnh lệnh hay yêu cầu không? Và nó hướng đến ai? : P – naught101

Trả lời

23

ggplot2 đang dần trở nên ngày càng mở rộng. Phiên bản phát triển, https://github.com/hadley/ggplot2/tree/develop, sử dụng roxygen2 (thay vì hai hệ thống homegrown riêng biệt), và đã bắt đầu chuyển từ proto sang các lớp S3 đơn giản hơn (hiện đang hoàn thành cho coords và scale). Hai thay đổi này hy vọng sẽ làm cho mã nguồn dễ hiểu hơn, và do đó dễ dàng hơn cho những người khác mở rộng (sao lưu bởi thực tế là yêu cầu kéo cho ggplot2 đang gia tăng).

Một cải tiến lớn khác sẽ được bao gồm trong phiên bản tiếp theo là cải tiến của Kohske Takahashi đối với hệ thống hướng dẫn (https://github.com/kohske/ggplot2/tree/feature/new-guides-with-gtable). Cũng như cải thiện các hướng dẫn mặc định (ví dụ: với thanh màu liên tục thanh lịch), các thay đổi của anh cũng giúp bạn ghi đè mặc định dễ dàng hơn bằng các chú thích và trục tùy chỉnh của riêng bạn. Điều này sẽ làm cho nó có thể vẽ các dấu ngoặc nhọn trong các trục, nơi chúng có thể thuộc về.

Vòng thay đổi lớn tiếp theo (có thể tôi sẽ không thể giải quyết cho đến mùa hè 2012) sẽ bao gồm viết lại các số liệu, số liệu thống kê và điều chỉnh vị trí dọc theo các đường nét trong gói lớp (https://github.com/hadley/layers) . Điều này sẽ làm cho các số liệu về địa lý, số liệu thống kê và vị trí dễ dàng hơn nhiều để viết và hy vọng sẽ thúc đẩy nhiều đóng góp của cộng đồng hơn, chẳng hạn như geom_tufteboxplot.

+1

Âm thanh như thế này sẽ xuất hiện thành hiện thực trong 1.1.0. Cảm ơn @hadley và phần còn lại của nhóm ggplot2. Dường như họa tiết ("extending-ggplot2") sẽ giải thích cách mở rộng. –

+1

Cơ chế mở rộng chính thức hiện có sẵn trong 2.0.0 http://blog.rstudio.org/2015/12/21/ggplot2-2-0-0/ –

5

Tại sao bạn muốn mở rộng? Động lực là gì? Như tôi thấy nó ggplot2 có nghĩa là một gói đồ họa cấp cao được thiết kế để tạo ra các hình ảnh đẹp từ một tập dữ liệu cụ thể. Và làm những điều đúng và làm cho những thứ khác dễ dàng: như quy mô, truyền thuyết, v.v. ggplot2 không có nghĩa là bộ công cụ đồ họa đa năng. Giống như mạng nó có một mô hình cụ thể trong tâm trí và bạn sử dụng nó cho mục đích đó.

lưới là bộ công cụ đồ họa cơ bản mà bạn muốn sử dụng để làm mục đích chung, tùy chỉnh âm mưu. Và IIRC, tương đối dễ dàng để thêm các ô lưới vào mạng hoặc ggplot2 lô/đối tượng, cho loại ký hiệu tùy ý/chú thích, v.v.

Điều không có ý nghĩa quá nhiều là mở rộng ggplot2 hoặc mạng dọc theo các dòng bạn đang nghĩ. Tôi không thấy lý do tại sao ggplot2 không thể làm các điểm nóng như vậy? Hay tôi đang thiếu thứ gì đó ở đây?

gì sẽ rất hữu ích sẽ được nếu can đảm xử lý dữ liệu của ggplot2 hoặc lưới đã có sẵn cho những người khác để viết mã âm mưu thực tế trên. Hadley đã đề cập điều này ở đâu đó trước đây.

ggplot2, đặc biệt, và lưới là mã khá khó khăn để có được vào để đọc/hiểu. ggplot2 sử dụng gói proto cho phiên bản OOP, điều này có nghĩa là bạn cần hiểu điều gì đang làm cũng như ggplot2 ngữ nghĩa. mạng tương tự như có rất nhiều tính toán trên ngôn ngữ được thực hiện ở đó, nếu bạn không quen thuộc với loại lập trình R đó, có thể khá đáng sợ, khó khăn và không thể xuyên thủng!

Đối lưới, tôi đề nghị bạn nhìn vào cuốn sách Graphics R Paul Murrell, một phiên bản thứ hai trong số đó là với nhà xuất bản: http://www.stat.auckland.ac.nz/~paul/RG2e/

Edit: Điểm Tôi đã có ý định có thể đi qua là các các giao diện được cung cấp bởi các gói như ggplot2 và mạng là nhất thiết phải cao cấp. Mở rộng chúng là tốt miễn là chúng dính vào mô hình/triết lý được sử dụng. Nhiệt có thể đã được thực hiện bằng cách sử dụng các geom hiện có; một phần của triết lý của hệ thống ggplot là tách dữ liệu ra khỏi màn hình/thuyết trình và sử dụng geom theo những cách thú vị để tạo ra màn hình mong muốn.

Gói cơ bản ggplot + cuộc gọi geom vào một hàm người dùng thân thiện hơn là OK miễn là i) nó hoạt động như ggplot đã làm và trả về một đối tượng, và ii) nó không có giao diện quá khác với cách ggplot hoạt động. Các nhà phát triển được tự do viết bất kỳ mã nào họ muốn, nó không chỉ hữu ích cho cộng đồng rộng lớn hơn để cung cấp các trình bao bọc di chuyển quá xa các hoạt động của bản gốc. Điều đó dẫn đến sự nhầm lẫn trên một phần của người dùng và không nuôi dưỡng việc học của chính ggplot2.

Ý tưởng định vị động thật thú vị; bạn có thể bao gồm những ý tưởng này trong tất cả các gói âm mưu. Bạn có thể khóa nó thành một geom, hoặc cách khác là một hàm ngoài thay đổi tọa độ đầu vào để tạo ra một đối tượng dữ liệu mới có thể được sử dụng bởi geom có ​​liên quan. Chức năng tương tự có thể được sử dụng cho các gói âm mưu khác - nó sẽ không cần phải là ggplot cụ thể.

+0

Chưa từng xem sách của Murrell trước đây. Nó sẽ có ích khi tôi đang mút xung quanh với ruột bên trong lưới. Làm rõ câu hỏi để giải quyết một số điểm của bạn. –

+2

Tôi nghĩ rằng bạn sẽ thấy rằng Hadley đang làm rất nhiều công việc để biến ít nhất một số yếu tố của ggplot thành một bộ công cụ mục đích chung. Đặc biệt, công việc tạo ra quy mô thông minh là một vấn đề rất khó khăn. Vì vậy, rất nhiều công việc đang xảy ra tại thời điểm này để làm cho cân ggplot có sẵn như là công cụ mục đích chung để sử dụng bởi, ví dụ, mạng. (xem, ví dụ: cuộc thảo luận này trên danh sách gửi thư ggplot2 http://groups.google.com/group/ggplot2/browse_thread/thread/8f5a1a7513ef0042) – Andrie

+0

@Andrie - Cảm ơn bạn đã biết chi tiết và liên kết. Tôi đã nhìn thấy một số điều này, nhưng không thể đặt tay/não của tôi vào chúng như vậy là không ủy thác trong câu trả lời của tôi như những gì Hadley đã nói ông sẽ làm/đang làm. Làm cho một số nội dung thông minh của ggplot2 có sẵn cho những người khác sẽ là một đóng góp rất hữu ích thực sự. –

8

Tôi không chắc chắn rằng tôi đồng ý với phân tích của bạn. Tôi sẽ giải thích lý do tại sao, và sau đó sẽ chỉ cho bạn một số tài nguyên để viết các geom của riêng bạn.

ggheat

Theo như tôi có thể nói, ggheat trả về một đối tượng của lớp ggplot. Vì vậy, nó là một wrapper thuận tiện xung quanh ggplot, tùy chỉnh cho một trường hợp sử dụng cụ thể. Mặc dù qplot là chung chung hơn nhiều, nó không về nguyên tắc cùng một điều: Nó là một wrapper xung quanh ggplot mà làm cho một số đoán đoán về dữ liệu và chọn mặc định hợp lý.Hadley gọi hàm lô này là và được mô tả ngắn gọn ở trang 181 của sách ggplot2.

dấu ngoặc nhọn

Giải pháp cú đúp xoăn thực hiện chính xác những gì triết lý ggplot nói, ví dụ: dữ liệu riêng biệt từ trình bày. Trong trường hợp này, dữ liệu được tạo ra bởi một hàm tùy chỉnh nhỏ và được lưu trữ trong một data.frame. Sau đó nó được hiển thị bằng cách sử dụng một geom có ​​ý nghĩa, tức là geom_line.

quo vadis?

Bạn đã lưu ý (trong số r chat room) mà bạn muốn có cách tiếp cận chung hơn để vẽ các dấu ngoặc nhọn. Một cái gì đó dọc theo dòng sau đây (và tôi diễn giải và mở rộng cùng một lúc):

  • dữ liệu cung cấp dưới hình thức một tọa độ khung giới hạn (tức là x0, x1, y0 và y1)
  • Chỉ định một "thống kê ", chẳng hạn như nẹp, hộp hoặc bất cứ điều gì
  • Chỉ định geom, chẳng hạn như geom_custom_shape

này nghe có vẻ như một sự tổng quát tốt đẹp và mở rộng của các ý tưởng đằng sau các giải pháp cú đúp xoăn, và sẽ rõ ràng yêu cầu viết một Geom mới . Có số ggplot wiki chính thức, nơi bạn có thể tìm thấy hướng dẫn cho creating a new geom.

+1

+1 & Chấp nhận, để tạo liên kết đến việc tạo trang địa lý mới, chính nó liên kết đến một số tham chiếu tốt về 'proto', trong đó @Gavin giải thích tầm quan trọng. –

+0

Có phải các hướng dẫn được liên kết ở trên để tạo mới geom mới không? Và những gì được khuyến cáo thực hành để bao gồm các geom mới trong các gói được gửi đến CRAN? –

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