[英]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.