아래 코드는 서브 플롯 사이에 간격을 생성합니다. 서브 플롯 사이의 간격을 제거하고 이미지를 좁은 격자로 만들려면 어떻게합니까?
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을 완전히 사용 하지 않고 다음을 사용하여 wspace 및 hspace 를 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)