簡體   English   中英

如何使用 pyplot 為兩個數據類創建散點圖 plot?

[英]How to create a scatter plot for two data classes with pyplot?

我有兩組數據, xy作為整數。 我需要使用 plot 這兩個數據點matplotlib.pyplot.scatter 我還需要 plot 第一個類別y == 0用一種顏色,第二個類別 y y == 1用另一種顏色。

我查看了散點圖 function 的文檔,但我不明白如何在一個 plot 中完成所有這些操作。

樣本數據:

2.897534798034255,0.872359037956732,1
1.234850239781278,-0.293047584301112,1
0.238575209753427,0.129572680572429,0
-0.109757648021958,0.484048547480385,1
1.109735783200013,-0.002785328902198,0
1.572803975652908,0.098547849368397,0

x 和 y 定義為:

x = data[:, [0, 1]]
y = data[:, -1].astype(int)

x 的大小是 2000,y 的大小是 1000

我的嘗試:

pl.scatter(x, y==0, s=3, c='r')
pl.scatter(x, y==1, s=3, c='b')
pl.show()

pyplot.scatter()接受 colors 的列表,因此:

c = ['r' if yy==0 else 'b' for yy in y]
plt.scatter(x, y, c=c)

在您的代碼中, y==0生成的掩碼只有TrueFalse值,而不是要繪制的y值。 如果xy是 numpy arrays,你可以這樣做:

mask = (y == 0)
plt.scatter(x[mask], y[mask], c='r')
mask = (y == 1)
plt.scatter(x[mask], y[mask], c='b')

你可以這樣做:

import numpy as np
import matplotlib.pyplot as plt

data = np.array([[2.897534798034255,0.872359037956732,1],
                 [1.234850239781278,-0.293047584301112,1],
                 [0.238575209753427,0.129572680572429,0],
                 [-0.109757648021958,0.484048547480385,1],
                 [1.109735783200013,-0.002785328902198,0],
                 [1.572803975652908,0.098547849368397,0]])

x = data[:, [0, 1]]
y = data[:, -1].astype(int)

plt.scatter(x[:,0][y==0], x[:,1][y==0], s=3, c='r')
plt.scatter(x[:,0][y==1], x[:,1][y==1], s=3, c='b')
plt.show()

雖然這可能更具可讀性:

x1 = data[:, 0]
x2 = data[:, 1]
y = data[:, -1].astype(int)

plt.scatter(x1[y==0], x2[y==0], s=3, c='r')
plt.scatter(x1[y==1], x2[y==1], s=3, c='b')

Output:

散點圖

不知道為什么要先提取xy並稍后過濾。 鑒於您有大量數據且類別不多,帶有標記的plt.plot也應該比plt.scatter更快:

import numpy as np
import matplotlib.pyplot as plt

data = np.asarray([[2.897534798034255,0.872359037956732,1],
                     [1.234850239781278,-0.293047584301112,1],
                     [0.238575209753427,0.129572680572429,0],
                     [-0.109757648021958,0.484048547480385,1],
                     [1.109735783200013,-0.002785328902198,0],
                     [1.572803975652908,0.098547849368397,0]])

colors = ["blue", "red", "green"]
labels = ["A", "B", "C"]

for i, c, l in zip(np.unique(data[:, 2]), colors, labels):   
    plt.plot(data[data[:, 2]==i][:, 0], data[data[:, 2]==i][:, 1], 
             marker="o", markersize=7, ls="None", color=c, 
             label=f"The letter {l} represents category {int(i)}")

plt.legend()
plt.show()

樣品 output: 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM