Почему оси не расширяются на plt.xlim(-1.5, 1.5)?

#python-3.x #matplotlib #seaborn

#python-3.x #matplotlib #seaborn

Вопрос:

Я пытаюсь расширить график с помощью plt.xlim(-1.5, 1.5) и plt.ylim(-1.5, 1.5) . Не могли бы вы объяснить, почему диапазон графика не соответствует ожиданиям?

введите описание изображения здесь

 import pandas as pd
from sklearn import preprocessing
from sklearn import decomposition
import matplotlib.pyplot as plt 
import seaborn as sns
sns.set_style('whitegrid')
import numpy as np 

# Change the image format to svg for better quality
%config InlineBackend.figure_format = 'svg'

decathlon = pd.read_csv("https://raw.githubusercontent.com/leanhdung1994/Deep-Learning/main/decathlon.txt", sep='t')
decathlon_scaled = decathlon.copy()
decathlon_scaled.iloc[:, 0:10] = preprocessing.scale(decathlon.iloc[:, 0:10])

pca_scaled = decomposition.PCA(n_components = 10).fit(decathlon_scaled.iloc[:, 0:10])
decathlon_scaled_pca = pca_scaled.transform(decathlon_scaled.iloc[:, 0:10])
decathlon_scaled_pca_nor = decathlon_scaled_pca / np.sqrt((decathlon_scaled_pca ** 2).sum(axis = 0))
decathlon_scaled_nor = decathlon_scaled.iloc[:, 0:10] / np.sqrt((decathlon_scaled.iloc[:, 0:10] ** 2).sum(axis = 0))
decathlon_corr_circle = decathlon_scaled_pca_nor.T.dot(decathlon_scaled_nor)
decathlon_corr_circle

tmp = np.transpose(decathlon_corr_circle)[:, 0:2]
tmp = pd.DataFrame(tmp)
tmp.index = decathlon.columns[0:10]

fig = plt.figure(figsize = 1 * np.array(plt.rcParams['figure.figsize'])) # This is to have bigger plot

ax = sns.scatterplot(data = tmp,
                      x = tmp[0], y = tmp[1])

for i in range(10):
    plt.arrow(0, 0, tmp[0][i], tmp[1][i],
              color = 'orange', head_width = 0.025, length_includes_head = True)

circle = plt.Circle((0, 0), 1, color='g', fill=False)
ax.add_artist(circle)

plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.axis('equal')
  

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

1. @JohanC Я только что попробовал ваше предложение, но оно не работает.

2. @JohanC это все еще не работает. Это не расширяет диапазон по оси y.

Ответ №1:

Проблема в том, что использование plt.axis('equal') эквивалентно использованию ax.set_aspect('equal', adjustable='datalim') . Это adjustable='datalim' изменяет пределы оси, даже если вы этого не хотите.

Использование объектно-ориентированного подхода для всех последних 3 строк кода является одним из способов решения этой проблемы, поскольку значение по умолчанию adjustable равно box , not datalim . box означает, что форма осей будет изменена для обеспечения равного соотношения сторон, по сравнению с datalim которым оси сохранят одинаковый размер, но изменят пределы оси. Использование версии конечного автомата, plt.axis('equal') , не позволяет вам установить для него значение box , поэтому объектно-ориентированный подход является лучшим вариантом для предоставления вам большего контроля.

Изменить

 plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.axis('equal')
  

Для

 ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_aspect('equal')
  

введите описание изображения здесь