#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')