Не так много функций, которые ведут себя так, именно по той причине, которую вы указали.plt.subplots
пытается обеспечить удобство для пользователей, создающих один субплот, или строку или столбец субплотов.Это поведение можно легко отключить с помощью параметра squeeze
, и в этом случае axis
станет двумерным массивом.
Вы можете сделать
f, axis = plt.subplots(N, 1, sharex=True, squeeze=False)
for ax in axis.ravel():
ax.plot(x,y)
Вызов ravel
гарантирует, что у вас есть одномерный массив во всех случаях.
Для более общего решения у вас есть несколько вариантов.Если форма результата зависит от входных данных, вы можете использовать оператор if
:
if N == 1: axis = [axis]
Если тип повторяемого возврата известен заранее, например, np.ndarray
, вы можете использоватьisinstance
:
if not isinstance(axis, np.ndarray): axis = [axis]
И, наконец, вы можете использовать обработку исключений:
try:
for ax in axis:
ax.plot(x, y)
except TypeError:
axis.plot(x, y)
Это можно перефразировать, чтобы избежать избыточности:
try:
iter(axis)
except TypeError:
axis = [axis]
Всеслучаи, конкретные или общие, являются грязными.Наличие очень разных типов возвращаемых значений не является хорошим дизайном по этой точной причине.К сожалению, вам нужно найти какой-то способ компенсации, если функция не позволяет отключить его.