Làm thế nào để loại bỏ khoảng cách giữa các lô phụ trong matplotlib?


116

Đoạn mã dưới đây tạo ra khoảng trống giữa các ô con. Làm cách nào để loại bỏ các khoảng trống giữa các ô con và làm cho hình ảnh trở thành một lưới chặt chẽ?

nhập mô tả hình ảnh ở đây

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
đăng một liên kết và nó có thể được chỉnh sửa. NoneNó không làm những gì bạn nghĩ, nó có nghĩa là 'sử dụng mặc định'.
tacaswell

Tôi đã thử thêm số thay vì 'Không có' nhưng điều này không giải quyết được vấn đề.
user3006135

4
plt.subplots_adjust(wspace=0, hspace=0)sẽ giải quyết vấn đề của bạn, không phải vì thực tế là bạn sử dụng 'equal'khía cạnh. Xem câu trả lời của tôi để biết chi tiết.
apdnu

Câu trả lời:


100

Bạn có thể sử dụng gridspec để kiểm soát khoảng cách giữa các trục. Có thêm thông tin ở đây.

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

trục rất gần nhau


35
Của nó không giới hạn GridSpec, nếu bạn lấy con số này ở sự sáng tạo bạn cũng có thể thiết lập khoảng cách với:fig.subplots_adjust(hspace=, wspace=)
Rutger Kassies

3
dòng cuối cùng trong forvòng lặp có nghĩa là gì?
Ciprian Tomoiagă

Đây là một mẹo rất hay, nhưng nó không sử dụng subplots. Câu trả lời này hoàn thành công việc mà không phải hy sinh subplots.
wizclown

Có cách nào để loại bỏ khoảng cách ngang chỉ giữa hàng trục thứ nhất và thứ hai không?
Stefano

136

Vấn đề là việc sử dụng aspect='equal', ngăn không cho các ô con kéo dài đến một tỷ lệ co tùy ý và lấp đầy tất cả không gian trống.

Thông thường, điều này sẽ hoạt động:

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)

Kết quả là:

Tuy nhiên, với aspect='equal', như trong đoạn mã sau:

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)

Đây là những gì chúng tôi nhận được:

Sự khác biệt trong trường hợp thứ hai này là bạn đã buộc trục x- và y có cùng số đơn vị / pixel. Vì các trục đi từ 0 đến 1 theo mặc định (tức là trước khi bạn vẽ bất cứ thứ gì), nên sử dụng aspect='equal'các lực để mỗi trục là một hình vuông. Vì hình không phải là hình vuông, pyplot thêm khoảng cách giữa các trục theo chiều ngang.

Để giải quyết vấn đề này, bạn có thể đặt con số của mình có tỷ lệ khung hình chính xác. Chúng tôi sẽ sử dụng giao diện pyplot hướng đối tượng ở đây, giao diện mà tôi cho là vượt trội hơn nói chung:

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)

Đây là kết quả:


3
Cảm ơn! câu trả lời của bạn là đơn giản và hoạt động hoàn hảo. plt.subplots_adjust(wspace=0, hspace=0)
MohamedEzz

35

Nếu không sử dụng hoàn toàn gridspec , những điều sau đây cũng có thể được sử dụng để loại bỏ các khoảng trống bằng cách đặt wspacehspace thành 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()

Dẫn đến:

.


4

Bạn đã thử plt.tight_layout()chưa?

với plt.tight_layout() nhập mô tả hình ảnh ở đây mà không có nó: nhập mô tả hình ảnh ở đây

Hoặc: một cái gì đó như thế này (sử dụng 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]))

Nếu bạn không cần chia sẻ trục, thì chỉ cần axLS=map(fig.add_axes, rectLS) nhập mô tả hình ảnh ở đây


Tôi đã thử bố cục chặt chẽ, nhưng nó không thoát khỏi khoảng trống, đó là điều tôi muốn. Giải pháp gridspec đã hoạt động. Cảm ơn về những đề nghị.
user3006135

Điều này hoạt động tuyệt vời khi kết hợp với các đề xuất khác. ght_layout () đã giúp loại bỏ khoảng trắng phía trên và các bên của âm mưu không phục vụ mục đích.
DChaps

0

Với các phiên bản matplotlib gần đây, bạn có thể muốn thử Bố cục ràng buộc . plt.subplot()Tuy nhiên, điều này không hoạt động với , vì vậy bạn cần sử dụng plt.subplots():

fig, axs = plt.subplots(4, 4, constrained_layout=True)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.