【问题标题】:Why don't the axes extend by plt.xlim(-1.5, 1.5)?为什么轴不延伸 plt.xlim(-1.5, 1.5)?
【发布时间】:2020-10-29 10:17:40
【问题描述】:

我正在尝试通过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')

【问题讨论】:

  • @JohanC 我刚刚尝试过你的建议,但它不起作用。
  • @JohanC 它仍然无法正常工作。它不会扩展 y 轴上的范围。

标签: python-3.x matplotlib seaborn


【解决方案1】:

问题是使用plt.axis('equal') 等同于使用ax.set_aspect('equal', adjustable='datalim')adjustable='datalim' 正在修改轴限制,即使您不希望这样做。

对所有最后 3 行代码使用面向对象的方法是解决此问题的一种方法,因为 adjustable 的默认值是 box,而不是 datalimbox 表示将更改轴的形状以强制执行相等的纵横比,而 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2016-08-02
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多