matplotlib에서 서브 플롯 사이의 간격을 제거하는 방법은 무엇입니까?


116

아래 코드는 서브 플롯 사이에 간격을 생성합니다. 서브 플롯 사이의 간격을 제거하고 이미지를 좁은 격자로 만들려면 어떻게합니까?

여기에 이미지 설명 입력

import matplotlib.pyplot as plt

for i in range(16):
    i = i + 1
    ax1 = plt.subplot(4, 4, i)
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')
    plt.subplots_adjust(wspace=None, hspace=None)
plt.show()

2
링크를 게시하면 편집 할 수 있습니다. None생각한대로하는 것이 아니라 '기본값 사용'을 의미합니다.
tacaswell 2013

'없음'대신 숫자를 추가하려고했지만 문제가 해결되지 않았습니다.
user3006135 nov.

4
plt.subplots_adjust(wspace=0, hspace=0)'equal'aspect 를 사용한다는 사실이 아니었다면 문제를 해결할 것 입니다. 자세한 내용은 내 대답을 참조하십시오.
apdnu

답변:


100

gridspec 을 사용 하여 축 사이의 간격을 제어 할 수 있습니다 . 여기에 더 많은 정보가 있습니다.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.figure(figsize = (4,4))
gs1 = gridspec.GridSpec(4, 4)
gs1.update(wspace=0.025, hspace=0.05) # set the spacing between axes. 

for i in range(16):
   # i = i + 1 # grid spec indexes from 0
    ax1 = plt.subplot(gs1[i])
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')

plt.show()

매우 가까운 축


35
에 국한되지 않고 GridSpec, 창조시 그림을 잡으면 다음과 같이 거리를 설정할 수도 있습니다.fig.subplots_adjust(hspace=, wspace=)
Rutger Kassies

3
for루프 의 마지막 줄은 무엇을 의미합니까?
Ciprian Tomoiagă

이것은 아주 좋은 팁이지만 subplots. 이 대답 은 희생없이 작업을 완료 subplots합니다.
wizclown

축의 첫 번째 행과 두 번째 행 사이의 수평 간격 제거하는 방법이 있습니까?
Stefano

136

문제는의 사용으로 aspect='equal'서브 플롯이 임의의 종횡비로 늘어나 모든 빈 공간을 채우는 것을 방지합니다.

일반적으로 다음과 같이 작동합니다.

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])

plt.subplots_adjust(wspace=0, hspace=0)

결과는 다음과 같습니다.

그러나 aspect='equal'다음 코드와 같이을 사용합니다.

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

plt.subplots_adjust(wspace=0, hspace=0)

이것이 우리가 얻는 것입니다.

이 두 번째 경우의 차이점은 x 축과 y 축이 동일한 수의 단위 / 픽셀을 갖도록 강제했다는 것입니다. 축은 기본적으로 0에서 1로 이동하므로 (즉, 플롯하기 전에)를 사용하면 aspect='equal'각 축이 정사각형이됩니다. 그림이 정사각형이 아니기 때문에 pyplot은 축 사이에 수평으로 추가 간격을 추가합니다.

이 문제를 해결하려면 올바른 종횡비를 갖도록 Figure를 설정할 수 있습니다. 여기서는 일반적으로 우월하다고 생각하는 객체 지향 pyplot 인터페이스를 사용할 것입니다.

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8)) # Notice the equal aspect ratio
ax = [fig.add_subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

fig.subplots_adjust(wspace=0, hspace=0)

결과는 다음과 같습니다.


3
감사! 당신의 대답은 간단하고 완벽하게 작동합니다. plt.subplots_adjust(wspace=0, hspace=0)
MohamedEzz 16.17.17

35

gridspec을 완전히 사용 하지 않고 다음을 사용하여 wspacehspace 를 0 으로 설정하여 간격을 제거 할 수도 있습니다 .

import matplotlib.pyplot as plt

plt.clf()
f, axarr = plt.subplots(4, 4, gridspec_kw = {'wspace':0, 'hspace':0})

for i, ax in enumerate(f.axes):
    ax.grid('on', linestyle='--')
    ax.set_xticklabels([])
    ax.set_yticklabels([])

plt.show()
plt.close()

를 야기하는:

.


4

시도해 보셨습니까 plt.tight_layout()?

plt.tight_layout() 여기에 이미지 설명 입력 그것없이 : 여기에 이미지 설명 입력

또는 : 이와 비슷한 것 (사용 add_axes)

left=[0.1,0.3,0.5,0.7]
width=[0.2,0.2, 0.2, 0.2]
rectLS=[]
for x in left:
   for y in left:
       rectLS.append([x, y, 0.2, 0.2])
axLS=[]
fig=plt.figure()
axLS.append(fig.add_axes(rectLS[0]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i],sharey=axLS[-1]))    
axLS.append(fig.add_axes(rectLS[4]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[8]))
for i in [5,6,7]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))     
axLS.append(fig.add_axes(rectLS[12]))
for i in [9,10,11]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))

축을 공유 할 필요가 없으면 간단히 axLS=map(fig.add_axes, rectLS) 여기에 이미지 설명 입력


타이트한 레이아웃을 시도했지만 틈새를 없애지 못했습니다. gridspec 솔루션이 작동했습니다. 제안 해 주셔서 감사합니다.
user3006135

이것은 다른 제안과 함께 훌륭하게 작동했습니다. tight_layout ()은 목적이없는 플롯의 위쪽과 측면에있는 공백을 제거하는 데 도움이되었습니다.
DChaps

0

최신 matplotlib 버전을 사용하면 Constrained Layout 을 사용해 볼 수 있습니다 . plt.subplot()그러나 이것은 작동하지 않으므로 plt.subplots()대신 사용해야 합니다.

fig, axs = plt.subplots(4, 4, constrained_layout=True)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.