【发布时间】:2019-02-01 08:59:19
【问题描述】:
绘制散点图的愚蠢方法
假设我有一个包含 3 个类的数据,下面的代码可以给我一个带有正确图例的完美图表,我在其中按类绘制数据。
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_blobs
import numpy as np
X, y = make_blobs()
X0 = X[y==0]
X1 = X[y==1]
X2 = X[y==2]
ax = plt.subplot(1,1,1)
ax.scatter(X0[:,0],X0[:,1], lw=0, s=40)
ax.scatter(X1[:,0],X1[:,1], lw=0, s=40)
ax.scatter(X2[:,0],X2[:,1], lw=0, s=40)
ax.legend(['0','1','2'])
绘制散点图的更好方法
但是,如果我有一个包含 3000 个类的数据集,则上述方法不再适用。 (你不会指望我写3000行对应每个类吧?) 所以我想出了下面的绘图代码。
num_classes = len(set(y))
palette = np.array(sns.color_palette("hls", num_classes))
ax = plt.subplot(1,1,1)
ax.scatter(X[:,0], X[:,1], lw=0, s=40, c=palette[y.astype(np.int)])
ax.legend(['0','1','2'])
这段代码很完美,我们可以只用 1 行绘制出所有的类。但是,这次的图例显示不正确。
问题
当我们使用以下方式绘制图形时,如何保持正确的图例?
ax.scatter(X[:,0], X[:,1], lw=0, s=40, c=palette[y.astype(np.int)])
【问题讨论】:
-
我认为 Matplotlib 的散点图从未打算按颜色、宽度或大小进行分组:后一种选择是传达附加信息,实际上是第三或第四轴,但不是按数据分组。相反,您应该只遍历数据集,创建单独的散点图。在分配子组的地方使用数组或字典,或者实际上不分配子组,而是在循环条件时立即绘制它们。
-
如果您有一个包含 3000 个类(或超过 20 个类)的数据集,那么您的标签和可读性问题与必须编写 3000 个几乎相同的行不同。
标签: python python-3.x matplotlib