繁体   English   中英

给定形式的矩阵的散点图

[英]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索引提取出来,提取出这些点的xy坐标,然后将这些点以散点图的形式绘制在图形上,在该点上我们将颜色手动指定为RGB元组以及所需的标记大小。

然后,我们创建标签的单元格数组,以表示每个聚类属于哪个点集,然后显示一个图例,该图例说明在给定此标签数组的情况下哪些点属于哪些聚类。

生成带有随机标签的随机数据,其中xy 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM