Matplotlib - Интервал размещения сетки - PullRequest
1 голос
/ 11 ноября 2011

Я пытаюсь расположить несколько сюжетов в виде сетки.Проблема заключается в том, что количество подзаголовков зависит от выбора пользователем данных для построения.Прямо сейчас я пытаюсь добавить графики следующим образом:

    l = len(clicked)

    self.p=wx.Panel(self)
    self.dpi=100
    self.fig = Figure()
    self.canvas = FigCanvas(self.p, -1, self.fig)
    if l == 1:
        self.splt = self.fig.add_subplot(1,1,1)
        self.plt=self.splt.plot(np.arange(5),np.arange(5))
    else:
        for i in np.arange(l):
            self.splt=self.fig.add_subplot(l+1,2,i+1)
            self.fig.subplots_adjust(left=0.7, bottom=0.6, right=0.75, top=0.75)
            self.plt=self.splt.plot(np.arange(5),np.arange(5))

Я просто использую поддельные данные для целей отладки.Во всяком случае, я использую wxPython, чтобы нарисовать это внутри фрейма.clicked здесь предоставляет количество выборов, сделанных пользователем.Я уже пытался использовать subplots_adjust(), с совершенно противоположным результатом, чем я хотел.Сюжеты сжимаются, что-то неразличимое.Есть ли способ упорядочить участки в какой-то сетке.Я видел, что есть опция subplot2grid, но я не получил ее для работы с переменным количеством подзаговоров.

1 Ответ

2 голосов
/ 16 ноября 2011

Надеюсь, это поможет:

from __future__ import division
import numpy as np
import pylab as plt

def divideSquare(N):
    if N<1:
        return 1,1

    minX = max(1,int(np.floor(np.sqrt(N))))
    maxX = max(minX+1, int(np.ceil(np.sqrt(5.0/3*N))))
    Nx = range(minX, maxX+1)
    Ny = [np.ceil(N/y) for y in Nx]
    err = [np.uint8(y*x - N) for y in Nx for x in Ny]
    ind = np.argmin(err)
    y = Nx[int(ind/len(Ny))]
    x = Ny[ind%len(Nx)]
    return min(y,x), max(y,x)

Nlist = np.arange(0,101)
empty = np.zeros_like(Nlist)
ratio = np.zeros_like(Nlist, dtype = float)
for k, N in enumerate(Nlist):
    y,x = divideSquare(N)
    empty[k] = y*x - N
    ratio[k] = 1.0 * x/y
    print y,x,y/x

plt.figure(1)
plt.clf()
y,x = divideSquare(2)
plt.subplot(y,x,1)    
plt.plot(Nlist, empty, 'k')
plt.xlabel('Number of plots')
plt.ylabel('Empty squares left')
plt.subplot(y,x,2)
plt.plot(Nlist, ratio, 'r')
plt.xlabel('Number of plots')
plt.ylabel('Ratio')

def divide2or3(N):
    if N<1:
        return 1,1
    if N%2==0:
        return int(np.ceil(N/2)), 2
    return int(np.ceil(N/3)), 3

Nlist = np.arange(0,101)
empty = np.zeros_like(Nlist)
ratio = np.zeros_like(Nlist, dtype = float)
for k, N in enumerate(Nlist):
    y,x = divide2or3(N)
    empty[k] = y*x - N
    ratio[k] = 1.0 * x/y
    print y,x,y/x

plt.figure(2)
plt.clf()
y,x = divide2or3(2)
plt.subplot(y,x,1)    
plt.plot(Nlist, empty, 'k')
plt.xlabel('Number of plots')
plt.ylabel('Empty squares left')
plt.subplot(y,x,2)
plt.plot(Nlist, ratio, 'r')
plt.xlabel('Number of plots')
plt.ylabel('Ratio')

plt.show()

divSquare (N) пытается получить соотношение, близкое к 1, но с минимальным количеством пустых позиций. div2or3 (N) дает сетку из 2 или 3 столбцов (или строк, если вы инвертируете x и y), но я не уверен, что это то, что вам нужно для 90 графиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...