Преобразуйте данные в «ближайший квадрат»

python matplotlib

140 просмотра

2 ответа

16 Репутация автора

Я довольно новичок в питоне. В настоящее время я использую matplotlib. У меня есть скрипт, который возвращает переменное количество подзаговоров, которые я передаю другому сценарию для построения графика. Я хочу расположить эти участки в хорошем порядке, т. Е. «Ближе всего к квадрату». Таким образом, ответ является уникальным, скажем, я на вес столбца выше

Примеры: Допустим, у меня есть 6 участков, сетка которых мне нужна, 2x3. Если у меня 9, это 3х3. Если у меня 12, это 3х4. Если у меня 17, это 4х5, но создается только один в последнем ряду.

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

    num_plots = 6
    square_size = ceil(sqrt(num_plots))**2

Но это оставит пустые участки. Есть ли способ сделать правильный размер сетки?

Автор: user6605695 Источник Размещён: 18.07.2016 10:34

Ответы (2)


2 плюса

1119 Репутация автора

Это то, что я сделал в прошлом

num_plots = 6
nr = int(num_plots**0.5)
nc = num_plots/nr
if nr*nc < num_plots:
    nr+=1
fig,axs = pyplot.subplots(nr,nc,sharex=True,sharey=True)
Автор: esmit Размещён: 18.07.2016 10:54

2 плюса

766 Репутация автора

Если у вас есть простое число графиков, таких как 5 или 7, нет способа сделать это, если вы не идете на один ряд или один столбец. Если есть 9 или 15 участков, это должно работать.

Пример ниже показывает, как

  • Пустые лишние участки
  • Сделайте так, чтобы указатель оси был двумерным массивом, чтобы вы могли индексировать его вообще, даже если есть только один график или один ряд графиков
  • Найдите правильную строку и столбец для каждого графика во время цикла

Вот:

nplots=13
#find number of columns, rows, and empty plots
nc=int(nplots**0.5)
nr=int(ceil(nplots/float(nc)))
empty=nr*nc-nplots
#make the plot grid
f,ax=pyplot.subplots(nr,nc,sharex=True)

#force ax to have two axes so we can index it properly
if nplots==1:
    ax=array([ax])
if nc==1:
    ax=ax.reshape(nr,1)
if nr==1:
    ax=ax.reshape(1,nc)

#hide the unused subplots
for i in range(empty): ax[-(1+i),-1].axis('off')

#loop through subplots and make output
for i in range(nplots):
    ic=i/nr #find which row we're on. If the definitions of ir and ic are switched, the indecies for empty (above) should be switched, too.
    ir=mod(i,nr) #find which column we're on
    axx=ax[ir,ic] #get a pointer to the subplot we're working with
    axx.set_title(i) 

Пример результата с использованием nplots = 1, nplots = 3 и nplots = 13

Автор: EL_DON Размещён: 18.07.2016 11:20
Вопросы из категории :
32x32