在单个子图中循环 Matplotlib
Loop in Matplotlib in a single subplot
我目前正在研究主成分分析,我想绘制一个相关圆,在我的例子中是 3,因为我有 3 个 PCA。
代码没问题,但我想在子图中显示结果(1 行,3 列),因为现在我有 3 个连续的数字。
当我尝试用 fig, ax = plt.subplots(1,3)
初始化 Matplotlib 图时,它 returns 3 个 1x3 子图的“网格”,每个子图内有 1 个圆圈。
因此,我想要 1 个“网格”,我的 3 个圆在同一行的 3 列中。
我的代码:
pcs = pca.components_
def display_circles(pcs, n_comp, pca, axis_ranks, labels=None, label_rotation=0, lims=None):
# Initialise the matplotlib figure
fig, ax = plt.subplots(1,3)
# For each factorial plane
for d1, d2 in axis_ranks:
if d2 < n_comp:
# Determine the limits of the chart
if lims is not None :
xmin, xmax, ymin, ymax = lims
elif pcs.shape[1] < 30 :
xmin, xmax, ymin, ymax = -1, 1, -1, 1
else :
xmin, xmax, ymin, ymax = min(pcs[d1,:]), max(pcs[d1,:]), min(pcs[d2,:]), max(pcs[d2,:])
# Add arrows
plt.quiver(np.zeros(pcs.shape[1]), np.zeros(pcs.shape[1]), pcs[d1,:], pcs[d2,:], angles='xy', scale_units='xy', scale=1, color="grey")
# Display variable names
if labels is not None:
for i,(x, y) in enumerate(pcs[[d1,d2]].T):
if x >= xmin and x <= xmax and y >= ymin and y <= ymax :
plt.text(x, y, labels[i], fontsize='10', ha='center', va='center', rotation=label_rotation, color="blue", alpha=0.5)
# Display circle
circle = plt.Circle((0,0), 1, facecolor='none', edgecolor='b')
plt.gca().add_artist(circle)
# Label the axes, with the percentage of variance explained
plt.xlabel('PC{} ({}%)'.format(d1+1, round(100*pca.explained_variance_ratio_[d1],1)))
plt.ylabel('PC{} ({}%)'.format(d2+1, round(100*pca.explained_variance_ratio_[d2],1)))
plt.title("Correlation Circle (PC{} and PC{})".format(d1+1, d2+1))
plt.show(block=False)
display_circles(pcs, num_components, pca, [(0,1), (1,2), (0,2)], labels = header)
感谢您的帮助!!
遗憾的是,您没有提供数据,所以这个答案只是为了解释您可以做些什么来实现您的目标。
您使用 fig, ax = plt.subplots(1,3)
创建了 3 个不同的轴,它们存储在 ax
中。所以,ax[0]
指的是左边第一个轴,ax[1]
指的是中间轴,ax[2]
指的是右边的轴。我们使用它们来定位正确的轴。
因为你有 3 个 PCA,我们需要一个索引来定位正确的轴。因此,将 for d1, d2 in axis_ranks:
更改为 for k, (d1, d2) in enumerate(axis_ranks):
。现在我们可以使用索引 k
来定位正确的轴。
接下来,您需要将 plt.
替换为 ax[i].
。但我们需要小心,因为某些方法将有不同的名称:
pcs = pca.components_
def display_circles(pcs, n_comp, pca, axis_ranks, labels=None, label_rotation=0, lims=None):
# Initialise the matplotlib figure
fig, ax = plt.subplots(1,3)
# For each factorial plane
for k, (d1, d2) in enumerate(axis_ranks):
if d2 < n_comp:
# Determine the limits of the chart
if lims is not None :
xmin, xmax, ymin, ymax = lims
elif pcs.shape[1] < 30 :
xmin, xmax, ymin, ymax = -1, 1, -1, 1
else :
xmin, xmax, ymin, ymax = min(pcs[d1,:]), max(pcs[d1,:]), min(pcs[d2,:]), max(pcs[d2,:])
# Add arrows
ax[k].quiver(np.zeros(pcs.shape[1]), np.zeros(pcs.shape[1]), pcs[d1,:], pcs[d2,:], angles='xy', scale_units='xy', scale=1, color="grey")
# Display variable names
if labels is not None:
for i,(x, y) in enumerate(pcs[[d1,d2]].T):
if x >= xmin and x <= xmax and y >= ymin and y <= ymax :
ax[k].text(x, y, labels[i], fontsize='10', ha='center', va='center', rotation=label_rotation, color="blue", alpha=0.5)
# Display circle
circle = plt.Circle((0,0), 1, facecolor='none', edgecolor='b')
ax[k].add_artist(circle)
# Label the axes, with the percentage of variance explained
ax[k].set_xlabel('PC{} ({}%)'.format(d1+1, round(100*pca.explained_variance_ratio_[d1],1)))
ax[k].set_ylabel('PC{} ({}%)'.format(d2+1, round(100*pca.explained_variance_ratio_[d2],1)))
ax[k].set_title("Correlation Circle (PC{} and PC{})".format(d1+1, d2+1))
display_circles(pcs, num_components, pca, [(0,1), (1,2), (0,2)], labels = header)
我目前正在研究主成分分析,我想绘制一个相关圆,在我的例子中是 3,因为我有 3 个 PCA。
代码没问题,但我想在子图中显示结果(1 行,3 列),因为现在我有 3 个连续的数字。
当我尝试用 fig, ax = plt.subplots(1,3)
初始化 Matplotlib 图时,它 returns 3 个 1x3 子图的“网格”,每个子图内有 1 个圆圈。
因此,我想要 1 个“网格”,我的 3 个圆在同一行的 3 列中。
我的代码:
pcs = pca.components_
def display_circles(pcs, n_comp, pca, axis_ranks, labels=None, label_rotation=0, lims=None):
# Initialise the matplotlib figure
fig, ax = plt.subplots(1,3)
# For each factorial plane
for d1, d2 in axis_ranks:
if d2 < n_comp:
# Determine the limits of the chart
if lims is not None :
xmin, xmax, ymin, ymax = lims
elif pcs.shape[1] < 30 :
xmin, xmax, ymin, ymax = -1, 1, -1, 1
else :
xmin, xmax, ymin, ymax = min(pcs[d1,:]), max(pcs[d1,:]), min(pcs[d2,:]), max(pcs[d2,:])
# Add arrows
plt.quiver(np.zeros(pcs.shape[1]), np.zeros(pcs.shape[1]), pcs[d1,:], pcs[d2,:], angles='xy', scale_units='xy', scale=1, color="grey")
# Display variable names
if labels is not None:
for i,(x, y) in enumerate(pcs[[d1,d2]].T):
if x >= xmin and x <= xmax and y >= ymin and y <= ymax :
plt.text(x, y, labels[i], fontsize='10', ha='center', va='center', rotation=label_rotation, color="blue", alpha=0.5)
# Display circle
circle = plt.Circle((0,0), 1, facecolor='none', edgecolor='b')
plt.gca().add_artist(circle)
# Label the axes, with the percentage of variance explained
plt.xlabel('PC{} ({}%)'.format(d1+1, round(100*pca.explained_variance_ratio_[d1],1)))
plt.ylabel('PC{} ({}%)'.format(d2+1, round(100*pca.explained_variance_ratio_[d2],1)))
plt.title("Correlation Circle (PC{} and PC{})".format(d1+1, d2+1))
plt.show(block=False)
display_circles(pcs, num_components, pca, [(0,1), (1,2), (0,2)], labels = header)
感谢您的帮助!!
遗憾的是,您没有提供数据,所以这个答案只是为了解释您可以做些什么来实现您的目标。
您使用 fig, ax = plt.subplots(1,3)
创建了 3 个不同的轴,它们存储在 ax
中。所以,ax[0]
指的是左边第一个轴,ax[1]
指的是中间轴,ax[2]
指的是右边的轴。我们使用它们来定位正确的轴。
因为你有 3 个 PCA,我们需要一个索引来定位正确的轴。因此,将 for d1, d2 in axis_ranks:
更改为 for k, (d1, d2) in enumerate(axis_ranks):
。现在我们可以使用索引 k
来定位正确的轴。
接下来,您需要将 plt.
替换为 ax[i].
。但我们需要小心,因为某些方法将有不同的名称:
pcs = pca.components_
def display_circles(pcs, n_comp, pca, axis_ranks, labels=None, label_rotation=0, lims=None):
# Initialise the matplotlib figure
fig, ax = plt.subplots(1,3)
# For each factorial plane
for k, (d1, d2) in enumerate(axis_ranks):
if d2 < n_comp:
# Determine the limits of the chart
if lims is not None :
xmin, xmax, ymin, ymax = lims
elif pcs.shape[1] < 30 :
xmin, xmax, ymin, ymax = -1, 1, -1, 1
else :
xmin, xmax, ymin, ymax = min(pcs[d1,:]), max(pcs[d1,:]), min(pcs[d2,:]), max(pcs[d2,:])
# Add arrows
ax[k].quiver(np.zeros(pcs.shape[1]), np.zeros(pcs.shape[1]), pcs[d1,:], pcs[d2,:], angles='xy', scale_units='xy', scale=1, color="grey")
# Display variable names
if labels is not None:
for i,(x, y) in enumerate(pcs[[d1,d2]].T):
if x >= xmin and x <= xmax and y >= ymin and y <= ymax :
ax[k].text(x, y, labels[i], fontsize='10', ha='center', va='center', rotation=label_rotation, color="blue", alpha=0.5)
# Display circle
circle = plt.Circle((0,0), 1, facecolor='none', edgecolor='b')
ax[k].add_artist(circle)
# Label the axes, with the percentage of variance explained
ax[k].set_xlabel('PC{} ({}%)'.format(d1+1, round(100*pca.explained_variance_ratio_[d1],1)))
ax[k].set_ylabel('PC{} ({}%)'.format(d2+1, round(100*pca.explained_variance_ratio_[d2],1)))
ax[k].set_title("Correlation Circle (PC{} and PC{})".format(d1+1, d2+1))
display_circles(pcs, num_components, pca, [(0,1), (1,2), (0,2)], labels = header)