etc./StackOverFlow

Matplotlib으로 그린 그림의 크기를 어떻게 변경합니까?

청렴결백한 만능 재주꾼 2021. 11. 23. 03:44
반응형

질문자 :tatwright


Matplotlib으로 그린 그림의 크기를 어떻게 변경합니까?



figure 은 호출 서명을 알려줍니다.

 from matplotlib.pyplot import figure figure(figsize=(8, 6), dpi=80)

figure(figsize=(1,1)) 는 다른 dpi 인수도 지정하지 않는 한 80x80 픽셀이 되는 inch-by-inch 이미지를 생성합니다.


Jouni K. Seppänen

그림을 이미 만들었다면 다음과 같이 빠르게 수행할 수 있습니다.

 fig = matplotlib.pyplot.gcf() fig.set_size_inches(18.5, 10.5) fig.savefig('test2png.png', dpi=100)

크기 변경을 기존 GUI 창에 전파하려면 forward=True 추가하십시오.

 fig.set_size_inches(18.5, 10.5, forward=True)

Pete

plt.rcParams 사용

Figure 환경을 사용하지 않고 크기를 변경하려는 경우에도 이 해결 방법이 있습니다. plt.plot() 을 사용하는 경우 너비와 높이로 튜플을 설정할 수 있습니다.

 import matplotlib.pyplot as plt plt.rcParams["figure.figsize"] = (20,3)

이것은 인라인으로 플롯할 때 매우 유용합니다(예: IPython Notebook 사용 ). asmaier가 알아차렸 듯이 이 문을 import 문과 같은 셀에 넣지 않는 것이 좋습니다.

후속 플롯에 대해 전역 Figure 크기를 기본값으로 재설정하려면:

 plt.rcParams["figure.figsize"] = plt.rcParamsDefault["figure.figsize"]

cm로 변환

figsize 튜플은 인치를 허용하므로 센티미터로 설정하려면 2.54로 나누어야 합니다. 이 질문을 보십시오 .


G M

지원 중단 참고 사항:
공식 Matplotlib 가이드 에 따르면 pylab 모듈의 사용은 더 이상 권장되지 않습니다. 이 다른 답변에 설명된 대로 matplotlib.pyplot 모듈을 대신 사용하는 것을 고려하십시오.

다음이 작동하는 것 같습니다.

 from pylab import rcParams rcParams['figure.figsize'] = 5, 10

이렇게 하면 Figure의 너비가 5인치, 높이가 10 인치가 됩니다.

그런 다음 Figure 클래스는 이를 인수 중 하나의 기본값으로 사용합니다.


tatwright

다음과 같이 간단한 코드를 시도하십시오.

 from matplotlib import pyplot as plt plt.figure(figsize=(1,1)) x = [1,2,3] plt.plot(x, x) plt.show()

플롯하기 전에 Figure 크기를 설정해야 합니다.


iPAS

Pandas 에서 그림 크기를 변경하는 방법을 찾고 있는 경우 예를 들어 다음을 수행할 수 있습니다.

 df['some_column'].plot(figsize=(10, 5))

여기서 df 는 Pandas 데이터 프레임입니다. 또는 기존 Figure 또는 좌표축을 사용하려면 다음을 수행합니다.

 fig, ax = plt.subplots(figsize=(10, 5)) df['some_column'].plot(ax=ax)

기본 설정을 변경하려면 다음을 수행할 수 있습니다.

 import matplotlib matplotlib.rc('figure', figsize=(10, 5))

Kris

'matplotlib figure size' 대한 Google의 첫 번째 링크는 AdjustingImageSize ( 페이지의 Google 캐시 )입니다.

다음은 위 페이지의 테스트 스크립트입니다. 동일한 이미지의 다양한 크기의 test[1-3].png

 #!/usr/bin/env python """ This is a small demo file that helps teach how to adjust figure sizes for matplotlib """ import matplotlib print "using MPL version:", matplotlib.__version__ matplotlib.use("WXAgg") # do this before pylab so you don'tget the default back end. import pylab import numpy as np # Generate and plot some simple data: x = np.arange(0, 2*np.pi, 0.1) y = np.sin(x) pylab.plot(x,y) F = pylab.gcf() # Now check everything with the defaults: DPI = F.get_dpi() print "DPI:", DPI DefaultSize = F.get_size_inches() print "Default size in Inches", DefaultSize print "Which should result in a %ix %i Image"%(DPI*DefaultSize[0], DPI*DefaultSize[1]) # the default is 100dpi for savefig: F.savefig("test1.png") # this gives me a 797 x 566 pixel image, which is about 100 DPI # Now make the image twice as big, while keeping the fonts and all the # same size F.set_size_inches( (DefaultSize[0]*2, DefaultSize[1]*2) ) Size = F.get_size_inches() print "Size in Inches", Size F.savefig("test2.png") # this results in a 1595x1132 image # Now make the image twice as big, making all the fonts and lines # bigger too. F.set_size_inches( DefaultSize )# resetthe size Size = F.get_size_inches() print "Size in Inches", Size F.savefig("test3.png", dpi = (200)) # change the dpi # this also results in a 1595x1132 image, but the fonts are larger.

산출:

 using MPL version: 0.98.1 DPI: 80 Default size in Inches [ 8. 6.] Which should result in a 640 x 480 Image Size in Inches [ 16. 12.] Size in Inches [ 16. 12.]

두 가지 메모:

  1. 모듈 설명과 실제 출력은 다릅니다.

  2. 이 답변을 사용하면 세 개의 이미지를 모두 하나의 이미지 파일에 쉽게 결합하여 크기의 차이를 확인할 수 있습니다.


jfs

import matplotlib.pyplot as plt plt.figure(figsize=(20,10)) plt.plot(x,y) ## This is your plot plt.show()

다음을 사용할 수도 있습니다.

 fig, ax = plt.subplots(figsize=(20, 10))

amalik2205

( matplotlib.figure.Figure 에서 ) 간단히 사용할 수 있습니다.

 fig.set_size_inches(width,height)

forward 키워드의 기본값이 True 이므로 캔버스에 대한 변경 사항이 즉시 표시됩니다.

둘 다 대신 너비 또는 높이를 변경하려면 다음을 사용할 수 있습니다.

fig.set_figwidth(val) 또는 fig.set_figheight(val)

이것은 또한 즉시 캔버스를 업데이트하지만 Matplotlib 2.2.0 이상에서만 가능합니다.

이전 버전의 경우

위에 지정된 것보다 오래된 버전에서 캔버스를 라이브 업데이트하려면 명시적으로 forward=True 를 지정해야 합니다. set_figwidthset_figheight 함수는 Matplotlib 1.5.0 이전 버전 forward 매개변수를 지원하지 않습니다.


River

fig = ... 행을 주석 처리하십시오.

 %matplotlib inline import numpy as np import matplotlib.pyplot as plt N = 50 x = np.random.rand(N) y = np.random.rand(N) area = np.pi * (15 * np.random.rand(N))**2 fig = plt.figure(figsize=(18, 18)) plt.scatter(x, y, s=area, alpha=0.5) plt.show()

Renaud

이것은 나를 위해 잘 작동합니다.

 from matplotlib import pyplot as plt F = plt.gcf() Size = F.get_size_inches() F.set_size_inches(Size[0]*2, Size[1]*2, forward=True) # Set forward to True to resize window along with plot in figure. plt.show() # Or plt.imshow(z_array) if using an animation, where z_array is a matrix or NumPy array

이 포럼 게시물도 도움이 될 수 있습니다. Figure 창 크기 조정


Blairg23

그림의 크기를 N배로 늘리려면 pl.show() 바로 앞에 이것을 삽입해야 합니다.

 N = 2 params = pl.gcf() plSize = params.get_size_inches() params.set_size_inches((plSize[0]*N, plSize[1]*N))

IPython 노트북과도 잘 작동합니다.


psihodelia

psihodelia의 답변 일반화 및 단순화 :

sizefactor 만큼 Figure의 현재 크기를 변경하려면 다음을 수행하십시오.

 import matplotlib.pyplot as plt # Here goes your code fig_size = plt.gcf().get_size_inches() # Get current size sizefactor = 0.8 # Set a zoom factor # Modify the current size by the factor plt.gcf().set_size_inches(sizefactor * fig_size)

현재 크기를 변경한 후 서브플롯 레이아웃 을 미세 조정해야 할 수 있습니다. 그림 창 GUI에서 또는 subplots_adjust 명령을 사용하여 수행할 수 있습니다.

예를 들어,

 plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)

loved.by.Jesus

정확한 이미지 크기를 픽셀 단위로 설정하기 위한 다양한 접근 방식 비교

이 답변은 다음에 중점을 둘 것입니다.

  • savefig : 화면에만 표시하지 않고 파일에 저장하는 방법
  • 크기를 픽셀 단위로 설정

다음은 내가 시도한 접근 방식 중 일부를 제공하는 이미지를 빠르게 비교한 것입니다.

이미지 크기를 설정하지 않고 기준선 예

비교 포인트를 얻으려면 다음을 수행하십시오.

base.py

 #!/usr/bin/env python3 import sys import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl fig, ax = plt.subplots() print('fig.dpi = {}'.format(fig.dpi)) print('fig.get_size_inches() = ' + str(fig.get_size_inches()) t = np.arange(-10., 10., 1.) plt.plot(t, t, '.') plt.plot(t, t**2, '.') ax.text(0., 60., 'Hello', fontdict=dict(size=25)) plt.savefig('base.png', format='png')

운영:

 ./base.py identify base.png

출력:

 fig.dpi = 100.0 fig.get_size_inches() = [6.4 4.8] base.png PNG 640x480 640x480+0+0 8-bit sRGB 13064B 0.000u 0:00.000

여기에 이미지 설명 입력

지금까지 내 최선의 접근 방식: plt.savefig(dpi=h/fig.get_size_inches()[1] 높이 전용 제어

나는 이것이 간단하고 규모가 크기 때문에 이것이 내가 대부분의 시간에 갈 것이라고 생각합니다.

get_size.py

 #!/usr/bin/env python3 import sys import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl height = int(sys.argv[1]) fig, ax = plt.subplots() t = np.arange(-10., 10., 1.) plt.plot(t, t, '.') plt.plot(t, t**2, '.') ax.text(0., 60., 'Hello', fontdict=dict(size=25)) plt.savefig( 'get_size.png', format='png', dpi=height/fig.get_size_inches()[1] )

운영:

 ./get_size.py 431

출력:

 get_size.png PNG 574x431 574x431+0+0 8-bit sRGB 10058B 0.000u 0:00.000

여기에 이미지 설명 입력

그리고

 ./get_size.py 1293

출력:

 main.png PNG 1724x1293 1724x1293+0+0 8-bit sRGB 46709B 0.000u 0:00.000

여기에 이미지 설명 입력

나는 일반적으로 텍스트 중간에서 이미지가 차지하는 수직 공간에 대해 가장 걱정하기 때문에 높이만 설정하는 경향이 있습니다.

plt.savefig(bbox_inches='tight' 는 이미지 크기를 변경합니다.

나는 항상 이미지 주위에 공백이 너무 많다고 느끼고 bbox_inches='tight' 를 추가하는 경향이 있습니다. matplotlib에 저장된 이미지 주위의 공백 제거

그러나 이는 이미지를 자르는 방식으로 작동하며 원하는 크기를 얻지 못합니다.

대신 동일한 질문에서 제안된 이 다른 접근 방식이 잘 작동하는 것 같습니다.

 plt.tight_layout(pad=1) plt.savefig(...

높이에 대한 정확한 원하는 높이는 431과 같습니다.

여기에 이미지 설명 입력

고정 높이, set_aspect , 자동으로 너비 및 작은 여백 크기 조정

음, set_aspect 다시 엉망이 되어 plt.tight_layout 이 실제로 여백을 제거하는 것을 방지합니다...

질문: 픽셀 단위의 고정 높이, 고정 데이터 x/y 종횡비를 얻고 Matplotlib에서 수평 공백 여백을 자동으로 제거하는 방법은 무엇입니까?

plt.savefig(dpi=h/fig.get_size_inches()[1] + 너비 제어

높이 외에 특정 너비가 정말로 필요한 경우 다음이 정상적으로 작동하는 것 같습니다.

너비.py

 #!/usr/bin/env python3 import sys import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl h = int(sys.argv[1]) w = int(sys.argv[2]) fig, ax = plt.subplots() wi, hi = fig.get_size_inches() fig.set_size_inches(hi*(w/h), hi) t = np.arange(-10., 10., 1.) plt.plot(t, t, '.') plt.plot(t, t**2, '.') ax.text(0., 60., 'Hello', fontdict=dict(size=25)) plt.savefig( 'width.png', format='png', dpi=h/hi )

운영:

 ./width.py 431 869

산출:

 width.png PNG 869x431 869x431+0+0 8-bit sRGB 10965B 0.000u 0:00.000

여기에 이미지 설명 입력

그리고 작은 너비의 경우:

 ./width.py 431 869

산출:

 width.png PNG 211x431 211x431+0+0 8-bit sRGB 6949B 0.000u 0:00.000

여기에 이미지 설명 입력

따라서 글꼴 크기가 올바르게 조정되는 것처럼 보이지만 레이블이 잘리는 매우 작은 너비(예: 왼쪽 상단 100

matplotlib에 저장된 이미지 주변의 공백 제거 를 사용하여 문제를 해결했습니다.

 plt.tight_layout(pad=1)

다음을 제공합니다.

 width.png PNG 211x431 211x431+0+0 8-bit sRGB 7134B 0.000u 0:00.000

여기에 이미지 설명 입력

이것에서 우리는 또한 tight_layout 이 이미지 상단의 많은 빈 공간을 제거한다는 것을 알 수 있습니다. 그래서 저는 일반적으로 항상 그것을 사용합니다.

고정 마법베이스 높이 dpifig.set_size_inchesplt.savefig(dpi= 스케일링

나는 이것이 https://stackoverflow.com/a/13714720/895245에 언급된 접근 방식과 동일하다고 생각합니다.

magic.py

 #!/usr/bin/env python3 import sys import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl magic_height = 300 w = int(sys.argv[1]) h = int(sys.argv[2]) dpi = 80 fig, ax = plt.subplots(dpi=dpi) fig.set_size_inches(magic_height*w/(h*dpi), magic_height/dpi) t = np.arange(-10., 10., 1.) plt.plot(t, t, '.') plt.plot(t, t**2, '.') ax.text(0., 60., 'Hello', fontdict=dict(size=25)) plt.savefig( 'magic.png', format='png', dpi=h/magic_height*dpi, )

운영:

 ./magic.py 431 231

출력:

 magic.png PNG 431x231 431x231+0+0 8-bit sRGB 7923B 0.000u 0:00.000

여기에 이미지 설명 입력

잘 확장되는지 확인하려면 다음을 수행합니다.

 ./magic.py 1291 693

출력:

 magic.png PNG 1291x693 1291x693+0+0 8-bit sRGB 25013B 0.000u 0:00.000

여기에 이미지 설명 입력

따라서 이 접근 방식도 잘 작동함을 알 수 있습니다. 내가 가진 유일한 문제는 그 magic_height 매개변수 또는 이에 상응하는 매개변수를 설정해야 한다는 것입니다.

고정 DPI + set_size_inches

이 접근 방식은 약간 잘못된 픽셀 크기를 제공했으며 모든 것을 매끄럽게 확장하기 어렵습니다.

set_size_inches.py

 #!/usr/bin/env python3 import sys import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl w = int(sys.argv[1]) h = int(sys.argv[2]) fig, ax = plt.subplots() fig.set_size_inches(w/fig.dpi, h/fig.dpi) t = np.arange(-10., 10., 1.) plt.plot(t, t, '.') plt.plot(t, t**2, '.') ax.text( 0, 60., 'Hello', # Keep font size fixed independently of DPI. # https://stackoverflow.com/questions/39395616/matplotlib-change-figsize-but-keep-fontsize-constant fontdict=dict(size=10*h/fig.dpi), ) plt.savefig( 'set_size_inches.png', format='png', )

운영:

 ./set_size_inches.py 431 231

출력:

 set_size_inches.png PNG 430x231 430x231+0+0 8-bit sRGB 8078B 0.000u 0:00.000

높이가 약간 떨어져 있고 이미지는 다음과 같습니다.

여기에 이미지 설명 입력

픽셀 크기도 3배 더 크게 만들면 정확합니다.

 ./set_size_inches.py 1291 693

출력:

 set_size_inches.png PNG 1291x693 1291x693+0+0 8-bit sRGB 19798B 0.000u 0:00.000

여기에 이미지 설명 입력

그러나 이 접근 방식이 멋지게 확장되려면 모든 DPI 종속 설정을 인치 단위의 크기에 비례해야 한다는 점을 이해합니다.

이전 예에서는 "Hello" 텍스트를 비례적으로만 만들었으며 예상대로 높이를 60에서 80 사이로 유지했습니다. 그러나 다음을 포함하여 우리가 하지 않은 모든 것은 작게 보입니다.

  • 축의 선 너비
  • 눈금 레이블
  • 포인트 마커

SVG

SVG 이미지에 대해 설정하는 방법을 찾을 수 없었습니다. 내 접근 방식은 PNG에서만 작동했습니다. 예:

get_size_svg.py

 #!/usr/bin/env python3 import sys import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl height = int(sys.argv[1]) fig, ax = plt.subplots() t = np.arange(-10., 10., 1.) plt.plot(t, t, '.') plt.plot(t, t**2, '.') ax.text(0., 60., 'Hello', fontdict=dict(size=25)) plt.savefig( 'get_size_svg.svg', format='svg', dpi=height/fig.get_size_inches()[1] )

운영:

 ./get_size_svg.py 431

생성된 출력에는 다음이 포함됩니다.

 <svg height="345.6pt" version="1.1" viewBox="0 0 460.8 345.6" width="460.8pt"

식별 말한다 :

 get_size_svg.svg SVG 614x461 614x461+0+0 8-bit sRGB 17094B 0.000u 0:00.000

Chromium 86에서 열면 브라우저 디버그 도구 마우스 이미지 호버가 해당 높이를 460.79로 확인합니다.

그러나 물론 SVG는 벡터 형식이므로 이론상 모든 것이 확장되어야 하므로 해상도 손실 없이 고정 크기 형식으로 변환할 수 있습니다. 예:

 inkscape -h 431 get_size_svg.svg -b FFF -e get_size_svg.png

정확한 높이를 제공합니다:

여기에 이미지 설명 입력

ImageMagick으로 날카로운 SVG 크기 조정을 얻으려면 -density 도 엉망으로 만들어야 하기 때문에 여기 convert 대신 Inkscape를 사용합니다.

그리고 <img height="" 설정하는 것은 브라우저에서도 작동해야 합니다.

matplotlib==3.2.2에서 테스트되었습니다.


Ciro Santilli 新疆再教育营六四事件法轮功郝海东

Matplotlib는 기본적으로 미터법을 사용할 수 없기 때문에 그림의 크기를 센티미터와 같은 합리적인 길이 단위로 지정하려면 다음을 수행할 수 있습니다( gns-ank의 코드).

 def cm2inch(*tupl): inch = 2.54 if isinstance(tupl[0], tuple): return tuple(i/inch for i in tupl[0]) else: return tuple(i/inch for i in tupl)

그런 다음 다음을 사용할 수 있습니다.

 plt.figure(figsize=cm2inch(21, 29.7))

Franck Dernoncourt

이것을 사용하십시오:

 plt.figure(figsize=(width,height))

widthheight 인치 단위입니다. 제공하지 않으면 기본값은 rcParams["figure.figsize"] = [6.4, 4.8] 입니다. 자세한 내용은 여기를 참조하십시오.


circassia_ai

이것은 그림이 그려진 직후에도 그림의 크기를 조정합니다(적어도 Qt4Agg/TkAgg를 사용하지만 Mac OS X는 사용하지 않음 - Matplotlib 1.4.0에서):

 matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)

wilywampa

다음은 확실히 작동하지만 plt.plot(x,y) , plt.pie()위에 plt.figure(figsize=(20,10)) 행을 추가해야 합니다.

 import matplotlib.pyplot as plt plt.figure(figsize=(20,10)) plt.plot(x,y) ## This is your plot plt.show()

코드는 amalik2205 에서 복사됩니다.


Shahriar Kabir Khan

또 다른 옵션은 Matplotlib에서 rc() 함수를 사용하는 것입니다(단위는 인치).

 import matplotlib matplotlib.rc('figure', figsize=[10,5])

Student222

사용자 정의 크기로 사용자 정의 그래프를 인쇄하는 방법입니다.

 import matplotlib.pyplot as plt from matplotlib.pyplot import figure figure(figsize=(16, 8), dpi=80) plt.plot(x_test, color = 'red', label = 'Predicted Price') plt.plot(y_test, color = 'blue', label = 'Actual Price') plt.title('Dollar to PKR Prediction') plt.xlabel('Predicted Price') plt.ylabel('Actual Dollar Price') plt.legend() plt.show()

Ali Muhammad Khowaja

새 Figure를 만들figsize 인수를 사용하여 크기(인치)를 지정할 수 있습니다.

 import matplotlib.pyplot as plt fig = plt.figure(figsize=(w,h))

기존 Figureset_size_inches() 메서드를 사용하세요.

 fig.set_size_inches(w,h)

기본 Figure 크기(6.4" x 4.8")를 변경하려면 "run commands" rc .

 plt.rc('figure', figsize=(w,h))

iacob

나는 항상 다음 패턴을 사용합니다.

 x_inches = 150*(1/25.4) # [mm]*constant y_inches = x_inches*(0.8) dpi = 96 fig = plt.figure(1, figsize = (x_inches,y_inches), dpi = dpi, constrained_layout = True)

이 예를 사용하면 그림 치수를 인치 또는 밀리미터로 설정할 수 있습니다. constrained_layoutTrue 설정하면 플롯이 테두리 없이 그림을 채웁니다.


Luguecos

출처 : http:www.stackoverflow.com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib

반응형