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

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

여기에 이미지 설명 입력

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()



답변

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()

매우 가까운 축


답변

문제는의 사용으로 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)

결과는 다음과 같습니다.


답변

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()

를 야기하는:

.


답변

시도해 보셨습니까 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)
여기에 이미지 설명 입력


답변

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

fig, axs = plt.subplots(4, 4, constrained_layout=True)


답변