[英]How to change plot marker of a subset of points when using matplotlib scatter function in python 3
我有許多自定義的 2d 點對象,每個對象都有:
問題是許多點將共享一個 label 1° 值,但在 label 2° 1 中可能會有所不同,反之亦然。
我嘗試提取有關 label 2° 值的點並分別繪制它們,這樣:
pointsSubset1 = getPointsWithLabel2Value1()
pointsSubset2 = getPointsWithLabel2Value2()
pointsSubset3 = getPointsWithLabel2Value3()
# just assume x y and labels values are obtained correctly
plt.scatter(x1, y1, c=listOfLabels1ForSubset1, cmap="nipy_spectral", marker='s') # plotting pointsSubset1
plt.scatter(x2, y2, c=listOfLabels1ForSubset2, cmap="nipy_spectral", marker='.') # plotting pointsSubset2
plt.scatter(x3, y3, c=listOfLabels1ForSubset3, cmap="nipy_spectral", marker='<') # plotting pointsSubset3
我認為這會奏效,但事實並非如此。 標記設置正確,但 colors 不正確...
忽略 x 和 y 坐標的示例:
子集1 =
子集2 =
在這種情況下,來自子集 1 的點 1 將與來自子集 2 的點 2 具有不同的標記,但兩者將共享相同的顏色(黑色),因為當兩者分別繪制時,盡管它們具有不同的 label1 值,但兩者都將映射到第一個顏色光譜……
我希望 cmap 中的 colors 索引在點的子集之間匹配,並且我不認為傳遞 colors 的自定義數組是解決方案 bc ZD304BA20E96D87411588EEABAC850E31Z,+inf 1 可能的值范圍'不知道如何管理 cmap 規范化)。
提前致謝。
我想會到達你想要的地方
Npoints = 50
x,y = np.random.random(size=(2,Npoints))
label1 = np.random.choice([-1,1,2,3], size=(Npoints,))
label2 = np.random.choice([1,2,3],size=(Npoints,))
label1_min = min(label1)
label1_max = max(label1)
marker_dict = {1:'s',2:'o',3:'<'}
fig, ax = plt.subplots()
for i,m in marker_dict.items():
ax.scatter(x[label2==i], y[label2==i], marker=m, c=label1[label2==i], cmap='nipy_spectral', vmin=label1_min, vmax=label1_max)
簡單的方法:
我將分享我的發現,以防萬一有人遇到同樣的問題。 事實證明,您可以調用 plt.scatter() 一次並為標記提供一組自定義大小。 這樣,您可以根據給定的標准(在我的情況下為標簽 2 值)“播放”更改標記大小,從而能夠在繪圖時看到點子集之間的差異。
它會是這樣的:
s = getMarkerCustomSizeForEachPoint()
# x is a list of every x coordinate
# y is a list of every y coordinate
# clusters is a list of every point label (label 1 value in my case)
# marker='s' -> squares
plt.scatter(x, y, c=clusters, cmap="nipy_spectral", marker='s', alpha=0.8, s=s)
將標記大小設置為非常小的數字,幾乎就像有點一樣,因此您可以使用正方形和“點”,而只指定標記='s':)
請記住,在構建不同的列表時,匹配的索引代表相同的點(在 x、y、簇和 s 中)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.