[英]Scatter plot for a matrix of a given form
假设我有一个形式为矩阵的矩阵,其中第一列都是x点,第二列都是y点,然后第三列和第四列是指示变量,它们指示该点是否属于特定的“集群”(可以是1或0;如果在第3列中第三行有1,则表示第三行的点属于群集1,由第3列表示。
我的问题是,如何创建图形,散布属于聚类1的所有点,然后在同一散布上以其他颜色散布其余点。 在Matlab中,我只想说figure
,然后hold on
并写下我的命令。 我是使用Python进行绘图的新手,不确定如何执行此操作。
编辑:
我想我成功了。 但是,我将如何更改标记大小,具体取决于该点所属的群集
让我们从如何在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元组以及所需的标记大小。
然后,我们创建标签的单元格数组,以表示每个聚类属于哪个点集,然后显示一个图例,该图例说明在给定此标签数组的情况下哪些点属于哪些聚类。
生成带有随机标签的随机数据,其中x
和y
20个点均匀分布在[0,1]
之间,并生成最多三个标签的随机集合:
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代码中看到的几乎相同。 有一些细微差别,例如matplotlib
hold on
工作的方式。 您无需使用hold on
因为您对图形所做的任何更改都将被记住,直到您决定显示图形为止。 您还有一些细微之处,其中numpy
和Python从0而不是1开始索引。
使用与MATLAB中相同的生成数据代码:
M = np.column_stack([np.random.rand(20,2), np.random.randint(1,4,size=(20,1))])
我得到这个图:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.