2012-09-11 25 views
5

Tôi đang cố gắng tạo một âm mưu với 7 subplots. Tại thời điểm này tôi đang âm mưu hai cột, một với bốn lô và khác với ba, tức là như thế này: enter image description hereMatplotlib: Định vị lại một subplot trong một mạng lưới các subplots

Tôi đang xây dựng cốt truyện này theo cách folowing:

#! /usr/bin/env python 
    import numpy as plotting 
    import matplotlib 
    from pylab import * 
    x = np.random.rand(20) 
    y = np.random.rand(20) 
    fig = figure(figsize=(6.5,12)) 
    subplots_adjust(wspace=0.2,hspace=0.2) 
    iplot = 420 
    for i in range(7): 
     iplot += 1 
     ax = fig.add_subplot(iplot) 
     ax.plot(x,y,'ko') 
     ax.set_xlabel("x") 
     ax.set_ylabel("y") 
    savefig("subplots_example.png",bbox_inches='tight') 

Tuy nhiên, để công bố tôi nghĩ rằng điều này có vẻ hơi xấu xí - những gì tôi muốn làm là di chuyển subplot cuối cùng vào giữa hai cột. Vì vậy, cách tốt nhất để điều chỉnh vị trí của subplot cuối cùng để nó là trung tâm là gì? I E. để có 6 subplots đầu tiên trong một mạng lưới 3X2 và subplot cuối cùng bên dưới trung tâm giữa hai cột. Nếu có thể, tôi muốn để có thể giữ for loop vì vậy mà tôi chỉ đơn giản là có thể sử dụng:

if i == 6: 
     # do something to reposition/centre this plot  

Cảm ơn,

Alex

+0

nó phải là một lưới 3x2? – Harpal

Trả lời

5

Nếu bạn muốn giữ cho vòng lặp, bạn có thể sắp xếp lô của bạn với subplot2grid, cho phép cho một tham số colspan:

#! /usr/bin/env python 
import numpy as plotting 
import matplotlib 
from pylab import * 
x = np.random.rand(20) 
y = np.random.rand(20) 
fig = figure(figsize=(6.5,12)) 
subplots_adjust(wspace=0.2,hspace=0.2) 
iplot = 420 
for i in range(7): 
    iplot += 1 
    if i == 6: 
     ax = subplot2grid((4,8), (i/2, 2), colspan=4) 
    else: 
     # You can be fancy and use subplot2grid for each plot, which dosen't 
     # require keeping the iplot variable: 
     # ax = subplot2grid((4,2), (i/2,i%2)) 

     # Or you can keep using add_subplot, which may be simpler: 
     ax = fig.add_subplot(iplot) 
    ax.plot(x,y,'ko') 
    ax.set_xlabel("x") 
    ax.set_ylabel("y") 
savefig("subplots_example.png",bbox_inches='tight') 

subplots in a grid with colspan

8

Sử dụng lưới đặc tả (doc) với một lưới 4x4, và có mỗi khoảng thời gian cốt truyện 2 cột như vậy:

import matplotlib.gridspec as gridspec 
gs = gridspec.GridSpec(4, 4) 
ax1 = plt.subplot(gs[0, 0:2]) 
ax2 = plt.subplot(gs[0,2:]) 
ax3 = plt.subplot(gs[1,0:2]) 
ax4 = plt.subplot(gs[1,2:]) 
ax5 = plt.subplot(gs[2,0:2]) 
ax6 = plt.subplot(gs[2,2:]) 
ax7 = plt.subplot(gs[3,1:3]) 
fig = gcf() 
gs.tight_layout(fig) 
ax_lst = [ax1,ax2,ax3,ax4,ax5,ax6,ax7] 
+0

Điều này hoạt động hoàn hảo. Bạn có thể kiểm soát khoảng cách giữa các lưới, cho phép các trục có nhãn, vv, sử dụng các kỹ thuật matplotlib tiêu chuẩn - IE 'fig = plt.figure (figsize = (10,15))' sau đó gọi mỗi subplot/grid 'gs .tight_layout (fig) ' – AGS

+0

Câu trả lời rất hay! Cảm ơn bạn! –