Python: подзаголовки с разными общими размерами

Исходное сообщение

Мне нужно сделать несколько участков с разными размерами.

У меня есть области моделирования размером (x y) от 35x6µm до 39x2µm, и я хочу изобразить их на одной фигуре. Все подграфики имеют одинаковые x-ticklabels (каждые 5µm на оси X есть линия сетки).

Когда я наношу подграфики на одну фигуру, то графики с небольшой x-областью растягиваются, так что x-figuresize полностью используется. Поэтому линии x-сетки больше не совпадают.

Как я могу добиться, чтобы подсюжеты больше не растягивались и выровнялись по левому краю?

Изменить: вот код:

    size=array([[3983,229],[3933,350],[3854,454],[3750,533],[3500,600]], dtype=np.float)
    resolution=array([[1024,256],[1024,320],[1024,448],[1024,512],[1024,640]], dtype=np.float)

    aspect_ratios=(resolution[:,0]/resolution[:,1])*(size[:,1]/size[:,0])

    number_of_graphs=len(data)
    fig, ax=plt.subplots(nrows=number_of_graphs, sharex=xshare)
    fig.set_size_inches(12,figheight)

    for i in range(number_of_graphs):
        temp=np.rot90(np.loadtxt(path+'/'+data[i])) 
        img=ax[i].imshow(temp, 
                 interpolation="none",
                 cmap=mapping, 
                 norm=specific_norm,
                 aspect=aspect_ratios[i]
                 )
        ax[i].set_adjustable('box-forced')

        #Here I have to set some ticks and labels....
        ax[i].xaxis.set_ticks(np.arange(0,int(size[i,0]),stepwidth_width)*resolution[i,0]/size[i,0])
        ax[i].set_xticklabels((np.arange(0, int(size[i,0]), stepwidth_width)))
        ax[i].yaxis.set_ticks(np.arange(0,int(size[i,1]),stepwidth_height)*resolution[i,1]/size[i,1])
        ax[i].set_yticklabels((np.arange(0, int(size[i,1]), stepwidth_height)))
        ax[i].set_title(str(mag[i]))
        grid(True)


    savefig(path+'/'+name+'all.pdf', bbox_inches='tight', pad_inches=0.05) #saves graph

Вот несколько примеров: Если я рисую разные матрицы в цикле for, iPhython выдает примерно то, что мне нужно. Y-расстояние между каждым подграфиком постоянно, и размер каждой фигуры правильный. Вы можете видеть, что x-метки совпадают: введите здесь описание изображения

Когда я строю матрицы на одном рисунке с помощью подграфиков, это не так: x-галочки не совпадают, и каждый подграфик имеет одинаковый размер на холсте (это означает, что для тонких подграфиков больше пробелов). зарезервировано на холсте...). введите здесь описание изображения

Мне просто нужен первый результат от iPython в одном выходном файле с использованием подзаголовков.

Использование GridSpec

После того, как сообщество посоветовало мне использовать GridSpec для прямого определения размера моих подграфиков, я написал код для автоматического построения графика:

size=array([[3983,229],[3933,350],[3854,454],[3750,533],[3500,600]], dtype=np.float)

#total size of the figure
total_height=int(sum(size[:,1]))
total_width=int(size.max())

#determines steps of ticks
stepwidth_width=500
stepwidth_height=200


fig, ax=plt.subplots(nrows=len(size))
fig.set_size_inches(size.max()/300., total_height/200)

gs = GridSpec(total_height, total_width)
gs.update(left=0, right=0.91, hspace=0.2)

height=0
for i in range (len(size)):    
    ax[i] = plt.subplot(gs[int(height):int(height+size[i,1]), 0:int(size[i,0])])

    temp=np.rot90(np.loadtxt(path+'/'+FFTs[i])) 
    img=ax[i].imshow(temp, 
             interpolation="none", 
             vmin=-100,
             vmax=+100,
             aspect=aspect_ratios[i],
             )

    #Some rescaling            
    ax[i].xaxis.set_ticks(np.arange(0,int(size[i,0]),stepwidth_width)*resolution[i,0]/size[i,0])
    ax[i].set_xticklabels((np.arange(0, int(size[i,0]), stepwidth_width)))
    ax[i].yaxis.set_ticks(np.arange(0,int(size[i,1]),stepwidth_height)*resolution[i,1]/size[i,1])
    ax[i].set_yticklabels((np.arange(0, int(size[i,1]), stepwidth_height)))
    ax[i].axvline(antenna[i]) #at the antenna position a vertical line is plotted
    grid(True)

    #colorbar
    cbaxes = fig.add_axes([0.93, 0.2, 0.01, 0.6])  #[left, bottom, width, height]
    cbar = plt.colorbar(img, cax = cbaxes, orientation='vertical')  
    tick_locator = ticker.MaxNLocator(nbins=3)
    cbar.locator = tick_locator
    cbar.ax.yaxis.set_major_locator(matplotlib.ticker.AutoLocator())
    cbar.set_label('Intensity', 
               #fontsize=12
               )
    cbar.update_ticks()

    height=height+size[i,1]


plt.show()

И вот результат.... введите здесь описание изображенияУ вас есть идеи?


person FrankTheTank    schedule 18.04.2014    source источник
comment
покажи нам код, а?   -  person Bruno Gelb    schedule 18.04.2014


Ответы (1)


Как насчет использования matplotlib.gridspec.GridSpec? документы.

Вы можете попробовать что-то вроде

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

gs = GridSpec(8, 39)
ax1 = plt.subplot(gs[:6, :35])
ax2 = plt.subplot(gs[6:, :])

data1 = np.random.rand(6, 35)
data2 = np.random.rand(2, 39)

ax1.imshow(data1)
ax2.imshow(data2)
plt.show()

введите здесь описание изображения

person wflynny    schedule 18.04.2014
comment
Спасибо за помощь. GridSpec очень полезен! Я отредактировал свой входной пост с проблемой, которая возникает, когда я использую gridspec.... - person FrankTheTank; 19.04.2014