matplotlib不会在散点图中显示图例

时间:2016-08-23 02:43:43

标签: python matplotlib plot cluster-analysis

我正在努力研究一个聚类问题,我需要为我的聚类绘制一个散点图。

%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']是实际的群集号。所以我希望这是我的颜色代码。

enter image description here

它向我展示了一个情节,但它没有向我展示传奇。它也没有给我错误。

我做错了吗?

2 个答案:

答案 0 :(得分:1)

这个问题困扰了我这么长时间。现在,我想提供另一个简单的解决方案。我们不必编写任何循环!!!

def vis(ax, df, label, title="visualization"):
    points = ax.scatter(df[:, 0], df[:, 1], c=label, label=label, alpha=0.7)
    ax.set_title(title)
    ax.legend(*points.legend_elements(), title="Classes")

答案 1 :(得分:0)

修改

生成一些随机数据:

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

绘图:

fig, ax = plt.subplots()
cmap = plt.cm.get_cmap('jet')
for i, cluster in df.groupby('cluster'):
    _ = ax.scatter(cluster['x'], cluster['y'], c=cmap(i/n_clusters), label=i)
ax.legend()

结果:

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对象,然后隐式使用 &#34;当前轴&#34; (plt.gca())。

  3. 旧简单解决方案

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

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

    enter image description here