Итеративная генерация вспомогательных участков в matplotlib по строкам и столбцам - построение только конечных осей - PullRequest
0 голосов
/ 20 ноября 2018

Я пишу код для построения взаимных корреляций каждого временного ряда в моих данных со всеми остальными, с двумя циклами for для индексации строки и позиции столбца соответственно (цикл столбца вложен в цикл строки).

В настоящее время только последние оси (то есть нижний правый угол) фигуры отображают любые данные, и каждая итерация цикла, как представляется, строится на этих осях.Мне интересно, если я допустил какие-либо очевидные ошибки с порядком команд во вложенных циклах for, или я неправильно интерпретировал входные аргументы функций matplotlib, таких как subplots ....

Код такой, как показано ниже:

fig, axes = plt.subplots(nrows=data_num, ncols=data_num, sharex=True, sharey=True)

for n in range(data_num):  #row index
    for p in range(data_num):  # column index
        x = data_df.iloc[:,n]  #get data for ROI according to row index
        print(x.head())
        x = x.values
        y = data_df.iloc[:,p]  #get data for ROI according to column index
        print(y.head())
        y = y.values
        axes[n,p] = plt.xcorr(x,y,normed=True)     #axes [row,column] = cross correlation plot of above data
        print(f'plotting at index [ {n} , {p}]')

1 Ответ

0 голосов
/ 20 ноября 2018

Это, возможно, неудачный способ работы pyplot и matplotlib: вам нужно создать графики на соответствующих осях , а не присваивать результат из вызова pyplot.xcorr осям.Таким образом: axis[n,p].xcorr(...).Таким образом, интерфейс внезапно становится несколько более объектно-ориентированным, чем обычные прямые вызовы pyplot.

Все графики заканчиваются только на последнем рисунке, потому что вы вызываете

plt.xcorr(x,y,normed=True)

Itне имеет значения, если вы затем присваиваете возвращаемое значение элементам массива осей, что не следует делать, так как это разрушает исходный массив осей.
plt.xcorr затем будет отображать все данные на одном графике поверхдруг с другом, потому что pyplot обычно действует на текущие активные оси, которые являются последними, созданными с помощью plt.subplots().


Это для объяснения.Вот пример решения (со случайными данными и простым точечным графиком):

import numpy as np
import matplotlib.pyplot as plt

data_num = 3

x = np.random.uniform(1, 10, size=(data_num, data_num, 20))
y = np.random.uniform(5, 20, size=(data_num, data_num, 20))

fig, axes = plt.subplots(nrows=data_num, ncols=data_num, sharex=True, sharey=True)
for n in range(data_num):  #row index
    for p in range(data_num):  # column index
        # Call `scatter` or any plot function on the 
        # respective `axes` object itself
        axes[n,p].scatter(x[n,p], y[n,p])
        print(f'plotting at index [ {n} , {p}]')
plt.savefig('figure.png')

и figure.png выглядит так (извините, нет разброса цветов или символов, только диаграммы рассеяния с голыми костями):

enter image description here

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