ipython에 표시하지 않고 pylab.savefig 호출


111

IPython 노트북에 표시하지 않고 파일에 그림을 만들어야합니다. 나는 이와 관련하여 IPython와 사이의 상호 작용에 대해 명확하지 않습니다 matplotlib.pylab. 그러나 pylab.savefig("test.png")현재 그림을 호출 하면 test.png. 대규모 플롯 파일 세트 생성을 자동화 할 때 이는 종종 바람직하지 않습니다. 또는 다른 앱에 의한 외부 처리를위한 중간 파일이 필요한 경우.

이것이 matplotlib또는 IPython노트북 질문 인지 확실하지 않습니다 .


@staticfloat의 대답은 노트북이 아니고 JuliaLang을 통해 matplotlib를 사용할 때도 저에게 효과적이었습니다. 사용ioff
Vass

답변:


173

이것은 matplotlib 질문이며, 사용자에게 표시되지 않는 백엔드 (예 : 'Agg')를 사용하여이 문제를 해결할 수 있습니다.

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

편집 : 플롯을 표시하는 기능을 잃지 않으려면 대화 형 모드 를 끄고 플롯을 표시 plt.show()할 준비가되었을 때만 호출 하십시오.

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()

2
좋아-하지만 일반적으로 iPython 내에서 인라인 플로팅을 유지하고 싶습니다. 백엔드에서 완전히 전환하면 제안한 내용이 제대로 작동합니다. 문제는 (인라인을 표시하지 않고) 그림을 저장하는 예외적 인 경우 인라인 플로팅의 일반적인 상황을 어떻게 허용합니까? 귀하의 제안으로 모듈을 다시로드하고 백엔드를 일시적으로 변경하려고 시도했지만 성공하지 못했습니다. iPython 노트북 세션 내에서 백엔드를 일시적으로 변경하는 방법에 대한 아이디어가 있습니까?
tnt

1
대화 형 플로팅과 문제를 해결할 close()show()명령 에 대해 이야기하기 위해 질문을 업데이트했습니다 . 백엔드를 즉시 변경하는 것은 지원되지 않습니다.
staticfloat 2013 년

3
훌륭한 피드백에 감사드립니다. plt.close (fig)가 내 필요에 맞는 핵심 ​​명령 인 것 같습니다. ioff가 작업에 영향을주지 않는 것 같기 때문에 아직 명확하지 않습니다. 그러나 나는 아마도 뭔가를 놓치고있을 것이다. 다시 한 번 감사드립니다.
tnt

1
내가 준 레시피는 일반적인 레시피입니다. ipython 노트북에서 작업하지 않는 경우 plt.ioff ()는 plt.plot()대화 형 모드가 켜져 있으면 호출하자마자 명령 줄 ipython 그림이 플로팅되므로 화면에서 그림이 깜박이는 것을 방지하는 데 중요합니다 . 대화 형 모드를 끄면까지 플롯 표시가 지연됩니다 plt.show(). ipython 노트북을 사용하고 있기 때문에 대화 형 모드는 다르게 취급됩니다.
staticfloat

나를 위해 matplotlib.use('Agg')혼자서 트릭을했습니다. 나는 아무것도 필요하지 않았다plt.show() 거나 plt.ioff()전혀 내 코드를.
Zhanwen Chen

67

plt.ioff()또는 plt.show()(사용하는 경우) 필요하지 않습니다 %matplotlib inline. 위의 코드는 plt.ioff(). plt.close()필수적인 역할을합니다. 이거 한번 해봐:

%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

iPython에서이 코드를 실행하면 두 번째 플롯이 표시 plt.close(fig2)되고 끝에 추가 하면 아무것도 표시되지 않습니다.

결론적으로 그림을로 닫으면 plt.close(fig)표시되지 않습니다.


5
실제로 더 나은 솔루션! 루프에서 많은 플롯을 생성하고 저장합니다. 로 plt.ioffI 얻을 RuntimeWarning: More than 20 figures have been opened.... plt.close해결했습니다.
Nagasaki45
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.