объект ‘numpy.ndarray’ не имеет атрибута ‘get_ylim’ после установки ограничений для диаграммы рассеяния seaborn в python

#python #numpy #seaborn

#python #тупой #сиборн

Вопрос:

Я работаю на python и пытаюсь изменить пределы диаграммы рассеяния. У меня есть следующий код:

 %matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=[12, 11])
ax2a = sns.lmplot('LOC_X',
                 'LOC_Y',
                 data=curry_data,
                 fit_reg=False,
                 height=10,
                 aspect=2)


plt.title('Steph Curry shot attempt')
# Set x-axis label
plt.xlabel('LOC X')
# Set y-axis label
plt.ylabel('LOC Y')




# Set x/y limits and labels

ax2a.set(xlim=(-300,300),ylim=(-100,500))


plt.show()

 

Я получаю этот вывод, поэтому визуально ось была успешно изменена.
введите описание изображения здесь

Однако при попытке запустить следующий код, чтобы убедиться, что диапазоны были изменены:

 ax2a.axes.get_ylim()
ax2a.axes.get_xlim()
 

Я получаю следующие ошибки

 AttributeError: 'numpy.ndarray' object has no attribute 'get_ylim'
AttributeError: 'numpy.ndarray' object has no attribute 'get_xlim'

 

Насколько я понимаю, я успешно изменил ограничения, однако я немного смущен тем, как подойти к этому для осей. Обычно я хочу построить диаграмму рассеяния и изменить границы осей диаграммы рассеяния. Как я могу сделать это так, чтобы при запуске последних двух строк кода я не получал ошибку и возвращал надлежащие ограничения? насколько я понимаю, код, который я запустил, должен был изменить оси.

Комментарии:

1. Некоторые из способов, которые вы установили ax2a.axes , чтобы быть массивом numpy, когда он должен быть axes объектом плоттера. Массив не имеет методов построения, таких как get_ylim .

Ответ №1:

Вы используете lmplot() , который использует a FacetGrid для отображения «набора данных на несколько осей, расположенных в сетке строк и столбцов, которые соответствуют уровням переменных в наборе данных». (цитируется по документации).

Свойство FacetGrid.axes всегда является 2D-массивом подзаголовка Axes , даже если FacetGrid имеет только один график. Поэтому, чтобы получить доступ к подзаголовку, вам необходимо выполнить

ax2a.axes[0,0].get_xlim()

При этом, если вам не нужны функции, предоставляемые a FacetGrid , вам было бы лучше использовать более простой sns.regplot() , или sns.scatterplot() , поскольку вы, похоже, тоже не заинтересованы в регрессии. Эти функции воздействуют на текущие оси и возвращают объект Axes напрямую.

Комментарии:

1. Хорошо, но как я могу настроить диаграмму рассеяния, чтобы при запуске ax2a.axes.get_xlim () она возвращала ограничение. По сути, я хотел бы изменить свою диаграмму рассеяния, чтобы ax2a.axes.get_xlim () работал и ax2a.axes.get_ylim () также работал

2. ax2a = sns.scatterplot(...); ax2a.set_xlim(-300,300); ax2a.get_xlim()

3. Большое вам спасибо, использование функции диаграммы рассеяния сделало свое дело