Подтвердить что ты не робот

Matplotlib итерация массива подзаголовков через единый список

Есть ли простой/чистый способ итерации массива оси, возвращаемой подзаголовками вроде

 nrow = ncol = 2
 a = []
 fig, axs = plt.subplots(nrows=nrow, ncols=ncol)
 for i, row in enumerate(axs):
     for j, ax in enumerate(row):
         a.append(ax)

 for i, ax in enumerate(a):
    ax.set_ylabel(str(i))

который работает даже для nrow или ncol = 1.

Я пробовал понимание списка, например:

[element for tupl in tupleOfTuples for element in tupl]

но это не удается, если nrows или ncols == 1

4b9b3361

Ответ 1

Возвращаемое значение ax представляет собой массив numpy, который может быть изменен, я считаю, без копирования данных. Если вы используете следующее, вы получите линейный массив, который вы можете перебрать по чистоте.

nrow = 1; ncol = 2;
fig, axs = plt.subplots(nrows=nrow, ncols=ncol) # edit should be at least 6 characters

for ax in axs.reshape(-1): 
  ax.set_ylabel(str(i))

Это не выполняется, когда ncols и nrows равны 1, так как возвращаемое значение не является массивом; вы можете повернуть возвращаемое значение в массив с одним элементом для согласованности, хотя он немного похож на клад:

nrow = 1; ncol = 1;
fig, axs = plt.subplots(nrows=nrow, ncols=nrow)
axs = np.array(axs)

for ax in axs.reshape(-1):
  ax.set_ylabel(str(i))

изменить документы. Аргумент -1 вызывает изменение размера выходных данных.

Ответ 2

Возвращаемое значение fig plt.subplots имеет список всех осей. Чтобы перебрать все подсети в фигуре, вы можете использовать:

nrow = 2
ncol = 2
fig, axs = plt.subplots(nrow, ncol)
for i, ax in enumerate(fig.axes):
    ax.set_ylabel(str(i))

Это также работает для nrow == ncol == 1.

Ответ 3

Я не уверен, когда он был добавлен, но теперь есть аргумент ключевого слова squeeze. Это гарантирует, что результат всегда будет массивом 2D numpy. Включение этого в одномерный массив легко:

fig, ax2d = subplots(2, 2, squeeze=False)
axli = ax2d.flatten()

Работает для любого количества подзаголовков, без трюка для одного топора, поэтому немного легче, чем принятый ответ (возможно, squeeze еще не существовал тогда).

Ответ 4

Matplotlib имеет свою собственную функцию сглаживания на осях.

Почему бы вам не попробовать следующий код?

fig, axes = plt.subplots(2, 3)
for ax in axes.flat:
    ## do something with instance of 'ax'