개체에 플롯 저장


83

에서는 ggplot2그래픽을 R 객체에 쉽게 저장할 수 있습니다.

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

표준 함수 plot는 그래픽을 void 함수로 생성하고 NULL을 반환합니다.

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

plot에서 만든 그래픽을 개체에 저장할 수 있습니까?


plot은 제네릭이며 plot내가 아는 한 다른 메소드가 그러한 객체를 반환합니다. plot.default그러나 실제로 NULL.
Konrad Rudolph

그래프를 p개체로 저장 한 후 입력하는 것만으로 그래프를 다시 그릴 수있는 것이 목표 입니까? 아니면 예를 들어 값을 변경할 수있는 객체로 저장 하시겠습니까?
LyzandeR

저장된 그래픽 위에 다른 그래픽을 오버레이하고 싶지만 생성 및 저장 한 플롯을 수정하는 것을 목표로하지 않습니다. 내가 당신의 질문에 대답 했습니까? Thks
Remi.b

@ Remi.b 감사합니다. 도움이 될 수있는 솔루션을 게시했습니다.
LyzandeR

답변:


95

기본 그래픽은 장치에서 직접 그립니다.

당신은 사용할 수 있습니다

1- recordPlot

2- 최근에 도입 된 gridGraphics패키지 , 기본 그래픽을 해당 그리드로 변환

여기에 최소한의 예가 있습니다.

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
나에게 명확하지 않습니다. 동일한 목표를 달성하기 위해 (1)과 (2) 별도의 방법이 있습니까, 아니면 OP의 질문에 답하는 데 두 단계가 모두 필요한가요?
NLi10Me

@ NLi10Me 두 가지 방법.
zx8754

시도 saveRDS(object = p, file = "p.Rds")하면 새 R 세션을로드하고 p <- readRDS(file = "p.Rds")다음을 실행 p하면 오류가 발생합니다.Error in replayPlot(x) : loading snapshot from a different session . p개체를 잘못 저장하고 있습니까?
user5359531

내가 받고있는 오류는 R 3.3.0 에서 해결 된 것으로 보이며 해당 버전을 사용하여 작동합니다. gridGraphics여기에 표시된 방법을 사용했을 때 다시 grid.grab(wrap=TRUE)
그린

34

나는 이것에 너무 늦었지만 내가 질문을 검색했을 때 나타난 첫 번째 질문이었습니다. 그래서 질문을 접하게 될 미래의 시청자를 위해 제 솔루션을 추가하고 싶습니다.

나는 객체 대신 함수를 사용하여 이것을 해결했습니다. 예를 들어, 다른 모수를 가진 두 개의 베타 분포를 비교한다고 가정합니다. 다음을 실행할 수 있습니다.

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

그리고 플롯을 객체가 아닌 함수 로 저장하십시오 .

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

다음으로 두 개의 플롯을 객체가 아닌 함수로 호출하여 원하는대로 각 플롯을 호출 할 수 있습니다.

z.plot1()

첫 번째 플롯을 플롯하고

z.plot2()

두 번째를 플롯합니다.

나중에 이것을 우연히 발견하는 사람에게 도움이되기를 바랍니다!


이것은 매우 유용합니다! 나는 이것이 내가 검색 한 무엇인가가 사전 플롯을 준비하기 위해 좋은 아이디어라고 생각
Jojostack

이것은 천재적인 기본 R 접근 방식입니다! recordPlot(창이 이미 열려있는 경우) 확실히 유용하지만이 답변은 사람들이이 게시물을 방문 할 때 찾는 것입니다. +1!
theforestecologist

복잡한 다중 플롯에 특히 유용합니다.
Joe

이 트릭을 정말 고맙게 여기는 사람들의 합창에 참여하겠습니다. 또한 학생들 :-) 대신
Laryx 탈락

구출에 대한 어휘 범위 다시 지정! :)
제이슨

17

pryr생성 된 개체의 값을 직접 변경하지 않으려면 패키지 의 활성 바인딩 기능을 사용할 수 있습니다 .

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

a콘솔에 입력 할 때마다 그래프가 화면에 다시 인쇄됩니다. %<a-%운영자는 스크립트를 (이것은 내가 생각하는 문제가되지 않습니다 하나의 그래프의 경우) 때마다 다시 실행됩니다. 따라서 본질적으로 a코드 를 사용할 때마다 다시 실행되어 그래프가 생성되어 물론 조작 (다른 플롯을 위에 오버레이)하거나 png예를 들어 저장할 수 있습니다. 값 자체는 저장되지 않습니다.a그러나 . 값은 여전히 ​​NULL입니다.

위의 내용이 귀하가 찾고있는 것인지는 모르겠지만 수용 가능한 솔루션 일 수 있습니다.


감사합니다. 이것은 매우 편리한 솔루션입니다. 플롯이 여러 라인 (예 : plot(1:10);abline(v=4)예)을 통해 빌드되는 경우 이것이 작동하는지 알고 있습니까? +1
Remi.b 2015

@ Remi.b 물론 그렇습니다. 그래도 이렇게 입력해야합니다 a %<a-% {plot(1:10);abline(v=4)}. " . 중괄호 안에 입력하면 원하는만큼 줄 수 있습니다. 또한 값을 다시 할당 a하려면 먼저 제거 rm(a)하고 다음을 사용 하여 다시 할당해야합니다. %<a-%. 연산자 그렇지 않으면 이런 일이 발생하는 이유는 알 수없는 경고를하지만 난 그게 큰 문제가 아닌 것 같아요.
LyzandeR

이것은 정말 멋지다! 이 이상한 함수 %<a-%가하는 일을하는 것이 불가능 해 보이기 때문에이 패키지에 대해 조금 읽어야 할 것 입니다. 감사합니다
Remi.b 2011

네, 해들리가 만든 정말 멋진 패키지 중 하나입니다. R 언어를 심도있게 이해할 수있는 함수 세트입니다. 또한 살펴보면 %<d-%나중에 유용 할 수 있습니다. 다행 나는 :) 도움이 될 수있다
LyzandeR

1
@LyzandeR 저장된 플롯을 다중 플롯으로 결합 할 수 있습니까?
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]])

귀하의 대답은 '올바른'것으로 보이지만 (하지만 저는 R 프로그래머가 아닙니다) Stack Overflow에서 단순히 '간결한'코드 전용 블록을 게시하는 것보다 설명 텍스트를 추가하는 것이 일반적인 관행입니다. 이것은 장기적으로 그리고 더 광범위한 사용자에게 대답을 더 가치있게 만듭니다. (하지만 어쨌든 찬성 투표를하세요!)
Adrian Mole

3
OP는 ggplot2 사용 하지 않고 이를 수행하는 방법에 대해 묻고 있었습니다.
Jason
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.