gpt4 book ai didi

python - matplotlib 不在散点图中显示图例

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:12 26 4
gpt4 key购买 nike

我正在尝试解决一个聚类问题,我需要为我的聚类绘制散点图。

%matplotlib inline
import matplotlib.pyplot as plt
df = pd.merge(dataframe,actual_cluster)
plt.scatter(df['x'], df['y'], c=df['cluster'])
plt.legend()
plt.show()

df['cluster'] is the actual cluster number. So I want that to be my color code.

enter image description here

它向我展示了一个情节,但它没有向我展示图例。它也不会给我错误。

我做错了什么吗?

最佳答案

编辑:

生成一些随机数据:

from scipy.cluster.vq import kmeans2
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

n_clusters = 10
df = pd.DataFrame({'x':np.random.randn(1000), 'y':np.random.randn(1000)})
_, df['cluster'] = kmeans2(df, n_clusters)

更新

  • 使用seaborn.relplotkind='scatter'或使用seaborn.scatterplot
    • 指定hue='cluster'
# figure level plot
sns.relplot(data=df, x='x', y='y', hue='cluster', palette='tab10', kind='scatter')

enter image description here

# axes level plot
fig, axes = plt.subplots(figsize=(6, 6))
sns.scatterplot(data=df, x='x', y='y', hue='cluster', palette='tab10', ax=axes)
axes.legend(loc='center left', bbox_to_anchor=(1, 0.5))

enter image description here

原始答案

绘图 (matplotlib v3.3.4):

fig, ax = plt.subplots(figsize=(8, 6))
cmap = plt.cm.get_cmap('jet')
for i, cluster in df.groupby('cluster'):
_ = ax.scatter(cluster['x'], cluster['y'], color=cmap(i/n_clusters), label=i, ec='k')
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

结果:

enter image description here

说明:

不要过多关注 matplotlib 内部的具体细节,一次绘制一个簇就可以解决问题。更具体地说,ax.scatter()返回 PathCollection我们在这里明确丢弃该对象,但它似乎在内部传递给某种图例处理程序。一次绘制所有内容仅生成一个 PathCollection/标签对,一次绘制一个簇时生成 n_clusters PathCollection/标签对。您可以通过调用ax.get_legend_handles_labels()来查看这些对象它返回类似的内容:

([<matplotlib.collections.PathCollection at 0x7f60c2ff2ac8>,
<matplotlib.collections.PathCollection at 0x7f60c2ff9d68>,
<matplotlib.collections.PathCollection at 0x7f60c2ff9390>,
<matplotlib.collections.PathCollection at 0x7f60c2f802e8>,
<matplotlib.collections.PathCollection at 0x7f60c2f809b0>,
<matplotlib.collections.PathCollection at 0x7f60c2ff9908>,
<matplotlib.collections.PathCollection at 0x7f60c2f85668>,
<matplotlib.collections.PathCollection at 0x7f60c2f8cc88>,
<matplotlib.collections.PathCollection at 0x7f60c2f8c748>,
<matplotlib.collections.PathCollection at 0x7f60c2f92d30>],
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])

实际上ax.legend()相当于 ax.legend(*ax.get_legend_handles_labels()) .

注释:

  1. 如果使用 Python 2,请确保 i/n_clustersfloat

  2. 省略fig, ax = plt.subplots()并使用 plt.<method>反而的ax.<method>工作正常,但我总是更喜欢明确地指定Axes我正在使用的对象而不是隐式使用“当前轴”(plt.gca())。

<小时/>

旧的简单解决方案

如果您可以使用颜色条(而不是离散值标签),您可以使用 Pandas 内置的 Matplotlib 功能:

df.plot.scatter('x', 'y', c='cluster', cmap='jet')

enter image description here

关于python - matplotlib 不在散点图中显示图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39091515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com