簡體   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