假设我有一个表格的矩阵,其中第一列是所有x点,第二列是所有y点,然后第三和第四列是指示变量是否属于某个特定的'集群&# 39; (可以是1或0;所以如果在第3列中我有第3行的1,则意味着第3行的点属于第1列所表示的第1列)。
我的问题是,如何创建一个图形,散点图所有属于聚类1的点,然后在同一个图上,将剩余点的颜色分散为另一种颜色。在Matlab中,我只会说figure
,然后是hold on
并写出我的命令。我不熟悉Python中的绘图,也不确定如何执行。
编辑:
我想我做到了。但是,我将如何更改标记大小,具体取决于该点属于哪个群集
答案 0 :(得分:2)
让我们从如何在MATLAB中做到这一点开始。
假设您拥有N
个唯一群集,您可以直接遍历尽可能多的群集,并plot
使用不同颜色的点。此外,我们可以在每次迭代时更改标记大小。您需要使用logical
索引来提取属于每个群集的点。鉴于你的矩阵存储在M
中,我想到了这样的事情:
rng(123); %// Set random seeds
%// Total number of clusters
N = max(M(:,3));
%// Create a colour map
cmap = rand(N,3);
%// Store point sizes per cluster
sizes = [10 14 18];
figure; hold on; %// Create a blank figure and hold for changes
for ii = 1 : N
%// Determine those points belonging to the ith cluster
ind = M(:,3) == ii;
%// Get the x and y coordinates
x = M(ind,1);
y = M(ind,2);
%// Plot the points in a different colour
plot(x,y,'.','Color', cmap(ii,:), 'MarkerSize', sizes(ii));
end
%// Create labels
labels = sprintfc('Label %d', 1:N);
%// Make our legend
legend(labels{:});
代码非常自我解释,您需要定义矩阵M
,我们通过取第三列的最大值来确定群集的总数。接下来,我们创建一个随机颜色映射,其中包含与聚类一样多的行,并且有三列对应于每个聚类的唯一RGB颜色。每一行都为我们在绘图时使用的每个聚类定义一种颜色。
接下来,我们创建一个大小数组,我们存储每个群集存储在一个数组中的每个点的半径。我们创建一个空白图形,保持它对我们对图形所做的更改然后我们迭代每个点集合。对于每个点群,找出M
中的正确点以通过logical
索引提取出来,提取出这些点的x
和y
坐标,然后绘制这些点在散点图中的图形上,我们手动将颜色指定为RGB元组以及所需的标记大小。
然后我们创建一个标签的单元格数组,表示每个集群所属的点集,然后显示一个图例,说明哪些点属于给定此标签数组的哪些集群。
使用随机标签生成随机数据,我们在[0,1]
和x
y
之间均匀分布20个点,并生成最多三个标签的随机集:
rng(123);
M = [rand(20,2) randi(3,20,1)];
当我运行上面的代码时,我得到了这个图:
要获得Python中的等价物,那很容易。它只是从MATLAB到Python的转录,绘图机制完全相同。您正在使用matplotlib
,因此我假设numpy
可以被用作依赖。
因此,等效代码看起来像这样:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123)
# Total number of clusters
N = int(np.max(M[:,2]))
# Create a colour map
cmap = np.random.rand(N, 3)
# Store point sizes per cluster
sizes = np.array([10, 14, 18]);
plt.figure(); # Create blank figure. No need to hold on
for ii in range(N):
# Determine those points belonging to the ith cluster
ind = M[:,2] == (ii+1)
# Get the x and y coordinates
x = M[ind,0];
y = M[ind,1];
# Plot the points in a different colour
# Also add in labels for legend
plt.plot(x,y,'.',color=tuple(cmap[ii]), markersize=sizes[ii], label='Cluster #' + str(ii+1))
# Make our legend
plt.legend()
# Show the image
plt.show()
我不打扰解释这个,因为它与您在MATLAB代码中看到的几乎相同。有一些细微差别,例如hold on
在matplotlib
中的工作方式。您不需要使用hold on
,因为在您决定显示该数字之前,您将记住所做的任何更改。您还有numpy
和Python开始索引为0而不是1的细微差别。
使用与MATLAB相同的代数据代码:
M = np.column_stack([np.random.rand(20,2), np.random.randint(1,4,size=(20,1))])
我得到这个数字: