2016-11-25 1 views
1

PNG 이미지로 저장하는 색상 막대가있는 산점도가 있습니다. 나는 어떤 그림 크기의 음모가 필요하지만 칼라 바를 추가하는 것은 원래 음모를 조정합니다.분산 형 플롯에 대한 컬러 바를 따로 저장

import pylab as plt 

plt.figure(figsize=FIGSIZE) 
plt.scatter(X, Y, c=Z, s=marker_size, norm=LogNorm(), vmin=VMIN, vmax=VMAX, cmap=CMAP,rasterized=True,lw=0,) 
CB = plt.colorbar(ticks=TICKS, format=FORMAT) 

원래 그림 (위의 그림과 같이 설정)과 컬러 바를 각각 별도의 이미지로 저장할 수 있습니까?

답변

3

확실한 대답은 "귀하의 컬러 바를 별도로 표시"입니다. 첫 번째 그림이 왜곡되지 않도록 새 그림 창을 만들고 여기에 색상 막대를 그려야합니다. 작은 예 :

import matplotlib.pyplot as plt 
import numpy as np # only for dummy data 

X,Y = np.mgrid[-2:3,-2:3] 
Z = np.random.rand(*X.shape) 
FIGSIZE = (2,3) 

plt.figure(figsize=FIGSIZE) 
mpb = plt.pcolormesh(X,Y,Z,cmap='viridis') 
# plot the original without a colorbar 
plt.savefig('plot_nocbar.png') 

# plot a colorbar into the original to see distortion 
plt.colorbar() 
plt.savefig('plot_withcbar.png') 

# draw a new figure and replot the colorbar there 
fig,ax = plt.subplots(figsize=FIGSIZE) 
plt.colorbar(mpb,ax=ax) 
ax.remove() 
plt.savefig('plot_onlycbar.png') 

# save the same figure with some approximate autocropping 
plt.savefig('plot_onlycbar_tight.png',bbox_inches='tight') 

이 생성 된 다음 네 가지 수치를 고려 (제대로 보려면 클릭) :

no colorbardistorted with colorbarseparate colorbar with much whitecropped colorbar

첫 번째는를 호출하지 않고 그림의 저장된 버전입니다 colormap. 이것은 괜찮습니다. 이것은 여러분이 보존하기를 원하는 것입니다. 두 번째 그림은 colorbar으로 전화를 걸면 어떤 일이 발생하는지 보여줍니다. 원본 그림에서 약간의 공간이 필요하므로이를 방지해야합니다.

원래 그림 크기 인 plt.subplots을 사용하여 새 그림 (및 축)을 열어야합니다. 이렇게하면 생성 된 색상 막대가 원본 그림에서 그려진 것과 같은 크기가 될 수 있습니다. 위의 설정에서 나는 matplotlib이 컬러 바 자체의 크기를 결정하도록했습니다; 그러나 그 후에는 결과 플롯을 오염시킬 보조 축을 삭제해야합니다. (다른 옵션은 새로운 그림에서 컬러 바의 예상 크기로 수동으로 하나의 축을 만드는 것입니다. 이것은 실현 가능한 과정이 아닌 것으로 생각됩니다.)

이제 세 번째 플롯에서 삭제 된 축 뒤에 남은 빈 공간은 결과 플롯에서 명확하게 볼 수 있습니다 (그러나 색상 막대의 크기는 그에 따라 적절합니다). 포스트 프로덕션에서이 공백을 수동으로 잘라내거나 컬러 바 이미지를 자동 자르기하는 것을 사용할 수 있습니다.

matplotlib 자체가 그림의 대부분을 자르기하는 플롯 버전도 포함되었습니다. bbox_inches='tight' 키워드 인수는 savefig으로 정확히 이루어집니다. 단점은 결과 이미지 파일에 네 번째 이미지에서 볼 수 있듯이 색상 막대 만 포함되어 있지만 결과 색상 막대의 크기가 원본과 약간 다를 수 있습니다. 특정 요구에 따라 가장 편리한 솔루션을 찾기 위해 사용 가능한 방법을 시험해야합니다.

+0

굉장! 고맙습니다! 마지막 예를 사용했습니다. 내가 이해할 수없는 유일한 이유는 dpi와 figsize를 설정하면 예상치 못한 크기의 결과 이미지가 생깁니다 (그림 크기 = (3,8) 및 dpi = 80로 설정했지만 결과 플롯은 240x640 픽셀 대신 144x660 픽셀 임) – AntonK

+1

@AntonK 'figure()'에 대한 호출에서'dpi = 80'을 설정하면 화면의 출력에만 영향을줍니다. 출력 파일에서 예상 dpi를 얻으려면'plt.savefig ("filename.png", dpi = 80)'을 호출 할 때'dpi = 80'을 설정해야합니다. (기본값은 100입니다.) 또한'bbox_inches = 'tight'을 사용하면 무화과 크기가 바뀌므로 출력 이미지 크기가 예측할 수 없게됩니다. 특정 출력 크기가 필요하다면,'bbox_inches = 'tight'을 호출해서는 안됩니다. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest 입력 해 주셔서 감사 드리며, 나는'dpi' 설정에 대해 거의 익숙하지 않습니다. colorbar에 관해서는, 나는이 크기 조정이 OP를 위해 OK 일 것이라고 믿습니다. 문제는 그 자체가 주어진 크기이고, 그 다음에 별도의 컬러 막대가 그 옆에 놓일 수 있다는 것입니다. 그렇지 않으면 질문이 이해가 안되는 것처럼 보입니다. , 적어도 나에게).이 경우 중요한 것은 생성 된 색상 막대가 그림에 대해 그려지는 것과 일치한다는 것입니다. 따라서 같은 크기의 그림부터 시작하는 것이 좋습니다 (그러나 실제로는 자동 크기 세트로 자릅니다. 컬러 바). –

관련 문제