我正在尝试更新以下函数,以便通过图例报告群集信息:
color_names = ["red", "blue", "yellow", "black", "pink", "purple", "orange"]
def plot_3d_transformed_data(df, title, colors="red"):
ax = plt.figure(figsize=(12,10)).gca(projection='3d')
#fig = plt.figure(figsize=(8, 8))
#ax = fig.add_subplot(111, projection='3d')
if type(colors) is np.ndarray:
for cname, class_label in zip(color_names, np.unique(colors)):
X_color = df[colors == class_label]
ax.scatter(X_color[:, 0], X_color[:, 1], X_color[:, 2], marker="x", c=cname, label=f"Cluster {class_label}" if type(colors) is np.ndarray else None)
else:
ax.scatter(df.Type, df.Length, df.Freq, alpha=0.6, c=colors, marker="x", label=str(clusterSizes) )
ax.set_xlabel("PC1: Type")
ax.set_ylabel("PC2: Length")
ax.set_zlabel("PC3: Frequency")
ax.set_title(title)
if type(colors) is np.ndarray:
#ax.legend()
plt.gca().legend()
plt.legend(bbox_to_anchor=(1.04,1), loc="upper left")
plt.show()
因此,我调用函数通过以下方式可视化集群模式:
plot_3d_transformed_data(pdf_km_pred,
f'Clustering rare URL parameters for data of date: {DATE_FROM} \nMethod: KMeans over PCA \nn_clusters={n_clusters} , Distance_Measure={DistanceMeasure}',
colors=pdf_km_pred.prediction_km)
print(clusterSizes)
遗憾的是,我不能显示图例,我必须在3D绘图下手动打印集群成员。这是没有图例的输出,错误如下:
No handles with labels found to put in legend.
我检查了这个post,但我无法找出函数中正确传递集群标签列表的错误。我想更新这个函数,这样我就可以通过clusterSizes.index
演示集群标签,并通过clusterSizes.size
演示它们的规模
预期输出:正如here所建议的,最好使用legend_elements()
来确定要显示的图例条目的有用数量,并自动返回句柄和标签的元组
更新:正如我在中提到的,预期输出应该包含一个集群标签的图例,另一个集群大小的图例(每个集群中的实例数)。它也可能通过单个图例报告此信息。
请参见以下2D示例:
在可视化集群的函数中,需要
ax.legend
而不是plt.legend
运行此示例代码,您将获得预期的图例句柄![enter image description here](https://i.stack.imgur.com/eEwQcm.png)
在创建第二个图例之前,您需要保存对第一个图例的引用,并将其作为单独的艺术家添加到
ax
。这样,对ax.legend(...)
的第二次调用不会删除第一个图例对于第二个图例,我只是为每种独特的颜色创建了一个圆圈,并将其添加到中。我忘了怎么画真正的圆,所以我用了
Line2D
和lw=0, marker="o"
来画圆使用图例的
bbox_to_anchor
和loc
关键字来获得令您满意的结果我摆脱了依赖
plt.<something>
的一切,因为这是忘记哪个方法附加到哪个对象的最好方法。现在一切都在ax.<something>
或fig.<something>
中。当您有多个轴时,或者当您想将画布嵌入PyQt应用程序时,这也是正确的方法plt
不会做你期望的事情最初的代码是由@r-初学者提供的,我只是在此基础上构建的
与问题无关:because of how markersize works for circles,可以使用
s = df["size"]**2
而不是s = df["size"]
相关问题 更多 >
编程相关推荐