簡體   English   中英

使用 matplotlib 散點圖 function 在 Z23EEEB4347BDD256BFCZB6333EEEB4347BDD256BFCZB6

[英]How to change plot marker of a subset of points when using matplotlib scatter function in python 3

我有許多自定義的 2d 點對象,每個對象都有:

  • 坐標 x 和 y
  • label 1°(-1 和 +inf 之間的整數):這將以標記的顏色表示(cmap 的索引)
  • label 2°([1 3] 范圍內的整數):我希望這個在標記類型中表示

問題是許多點將共享一個 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 =

    • 要點1:
      • 標簽1:-1
      • 標簽2:1
  • 子集2 =

    • 要點2:
      • 標簽1:1
      • 標簽2: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.

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