Lưu một âm mưu trong một đối tượng


83

Trong đó ggplot2, người ta có thể dễ dàng lưu một đồ họa vào một đối tượng R.

p = ggplot(...) + geom_point()      # does not display the graph
p                                   # displays the graph

Hàm chuẩn plottạo ra đồ họa dưới dạng hàm void và trả về NULL.

p = plot(1:10)     # displays the graph
p                  # NULL

Có thể lưu một đồ họa được tạo bởi plotmột đối tượng không?


plotlà một chung và các plotphương thức khác nhau trả về các đối tượng như vậy theo như tôi biết. plot.default, tuy nhiên, thực sự trả lại NULL.
Konrad Rudolph

Mục tiêu của bạn là có thể vẽ lại biểu đồ của mình chỉ bằng cách nhập psau khi lưu nó dưới dạng một đối tượng? Hay bạn muốn lưu nó dưới dạng một đối tượng mà sau đó bạn có thể thay đổi các giá trị của nó chẳng hạn?
LyzandeR

Tôi có thể muốn phủ các đồ họa khác lên trên đồ họa đã lưu nhưng tôi không nhắm đến việc sửa đổi cốt truyện đã được tạo và lưu. Tôi đã trả lời câu hỏi của bạn chưa nhỉ? Thks
Remi.b

@ Remi.b Nó cảm ơn. Tôi đã đăng một giải pháp có thể hữu ích.
LyzandeR

Câu trả lời:


95

đồ họa cơ sở vẽ trực tiếp trên thiết bị.

Bạn đã có thể sử dụng

1- recordPlot

2- gridGraphicsgói được giới thiệu gần đây , để chuyển đổi đồ họa cơ sở sang dạng lưới tương đương

Đây là một ví dụ tối thiểu,

plot(1:10) 

p <- recordPlot()
plot.new() ## clean up device
p # redraw

## grab the scene as a grid object
library(gridGraphics)
library(grid)
grid.echo()
a <- grid.grab()

## draw it, changes optional
grid.newpage()
a <- editGrob(a, vp=viewport(width=unit(2,"in")), gp=gpar(fontsize=10))
grid.draw(a)

1
Tôi không rõ: (1) và (2) các phương pháp riêng biệt để đạt được cùng một mục tiêu, hay cả hai bước đều cần thiết để trả lời câu hỏi của OP?
NLi10Me

@ NLi10Me 2 phương pháp khác nhau.
zx8754

Nếu tôi thử saveRDS(object = p, file = "p.Rds"), sau đó tải một phiên R mới, chạy p <- readRDS(file = "p.Rds")sau đó p, tôi nhận được thông báo lỗi Error in replayPlot(x) : loading snapshot from a different session. Tôi đang lưu pđối tượng không chính xác?
user5359531

Có vẻ như lỗi tôi gặp phải đã được giải quyết trong R 3.3.0 , sử dụng phiên bản đó. Khi tôi sử dụng gridGraphicsphương pháp trình bày ở đây, màu sắc trên cốt truyện vẽ lại tiếp tục nhận được sai lầm, ngay cả vớigrid.grab(wrap=TRUE)
user5359531

34

Tôi rất muộn để làm điều này, nhưng đó là câu hỏi đầu tiên xuất hiện khi tôi tìm kiếm câu hỏi. Vì vậy, tôi muốn thêm giải pháp của mình cho những người xem tương lai bắt gặp câu hỏi.

Tôi đã giải quyết điều này bằng cách sử dụng một hàm thay vì một đối tượng. Ví dụ: giả sử chúng ta muốn so sánh hai bản phân phối beta với các tham số khác nhau. Chúng tôi có thể chạy:

z1<-rbeta(10000,5,5)
z2<-rbeta(10000,20,20)
plotit<-function(vector,alpha,beta){
plot(density(vector),xlim=c(0,1))
abline(v=alpha/(alpha+beta),lty="longdash")
}

Và lưu các ô dưới dạng hàm chứ không phải đối tượng.

z.plot1<-function(){plotit(z1,5,5)}
z.plot2<-function(){plotit(z2,20,20)}

Tiếp theo, chúng ta có thể gọi từng ô như chúng ta muốn bằng cách đơn giản gọi hai ô dưới dạng hàm chứ không phải đối tượng.

z.plot1()

vạch ra âm mưu đầu tiên và

z.plot2()

âm mưu thứ hai.

Hy vọng điều đó sẽ giúp những người tình cờ gặp phải điều này sau này!


Điều này rất hữu ích! Tôi nghĩ rằng đó là một ý tưởng tuyệt vời để chuẩn bị cài đặt trước âm mưu này là những gì tôi đang tìm kiếm
Jojostack

Đây là một cách tiếp cận cơ sở R thiên tài! recordPlotchắc chắn hữu ích (nếu bạn đã mở một cửa sổ), nhưng câu trả lời này chính xác là những gì mọi người đang tìm kiếm khi họ truy cập bài đăng này. +1!
theforestecologist

Đặc biệt hữu ích cho nhiều lô phức tạp.
Joe

Hãy để tôi tham gia vào điệp khúc của những người thực sự đánh giá cao thủ thuật này. Cũng thay mặt học sinh của tôi :-)
Laryx Decidua

Lexical phạm vi để giải cứu một lần nữa! :)
Jason

17

Bạn có thể sử dụng tính năng ràng buộc hoạt động của pryrgói nếu bạn không muốn trực tiếp thay đổi các giá trị của đối tượng được tạo.

library(pryr)
a %<a-% plot(1:10,1:10)

Mỗi lần bạn gõ atrên bảng điều khiển, biểu đồ sẽ được in lại trên màn hình. Người %<a-%vận hành sẽ chạy lại tập lệnh mỗi lần (trong trường hợp có một biểu đồ, tôi nghĩ đây không phải là vấn đề). Vì vậy, về cơ bản mỗi khi bạn sử dụng a, mã sẽ được chạy lại dẫn đến biểu đồ của bạn, tất nhiên bạn có thể thao tác (chồng một âm mưu khác lên trên) hoặc lưu bằng cách sử dụng pngchẳng hạn. aTuy nhiên, không có giá trị nào được lưu trữ trong đó . Giá trị sẽ vẫn là NULL.

Tôi không biết liệu trên có phải là những gì bạn đang tìm kiếm hay không nhưng nó có thể là một giải pháp chấp nhận được.


Cảm ơn bạn. Đó là một giải pháp rất tiện dụng. Bạn có biết liệu điều này có hiệu quả không nếu cốt truyện được xây dựng qua nhiều dòng (chẳng hạn như chẳng plot(1:10);abline(v=4)hạn)? +1
Remi.b

@ Remi.b Tất nhiên là có. Tuy nhiên, bạn cần phải nhập nó như thế này " a %<a-% {plot(1:10);abline(v=4)}. Nếu bạn nhập nó vào bên trong các dấu ngoặc nhọn đó, bạn có thể có bao nhiêu dòng tùy thích! Ngoài ra, nếu bạn muốn gán lại một giá trị cho abạn, trước tiên bạn cần xóa nó với rm(a)và sau đó gán lại với các %<a-%nhà khai thác khác bạn nhận được một cảnh báo tôi không biết tại sao điều này xảy ra nhưng tôi đoán nó không phải là một vấn đề lớn..
LyzandeR

Điều này thực sự tuyệt vời! Tôi sẽ phải đọc một chút về gói này vì có vẻ như tôi không thể làm được những gì mà chức năng kỳ lạ %<a-%này đang làm. Cảm ơn
Remi.b

Vâng, nó là một trong những gói thực sự tuyệt vời mà Hadley đã làm. Nó là một tập hợp các chức năng cho phép bạn hiểu sâu về ngôn ngữ R. Hãy xem qua %<d-%, nó có thể hữu ích sau này. Rất vui vì tôi có thể giúp đỡ :)
LyzandeR

1
@LyzandeR có thể kết hợp các ô đã lưu thành một ô nhiều không?
user2300940,

-4
library(ggplot2)
# if mygraph is a plot object
ggsave("myplot1.png",mygraph)

# if the plot is in a list (e.g. created by the Bibliometrics package)
ggsave("myplot1.png",mygraphs[[1]])

Mặc dù câu trả lời của bạn có vẻ 'đúng' (nhưng tôi không phải là lập trình viên R), thông thường trên Stack Overflow là thêm một số văn bản giải thích, thay vì chỉ đăng một khối chỉ có mã 'ngắn gọn'. Điều này làm cho câu trả lời có giá trị hơn trong dài hạn và cho nhiều người dùng hơn. (Nhưng dù sao cũng có một sự ủng hộ!)
Adrian Mole

3
OP đã hỏi về cách thực hiện điều này mà không cần sử dụng ggplot2.
Jason
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.