簡體   English   中英

如何在matplotlib中為散點圖中的每個點繪制不同深淺的顏色?

[英]How to plot different shades of a color for each point in a scatter plot in matplotlib?

我試圖繪制一個散點圖,其中散點圖中的每個點都應對應於我選擇的給定顏色的特定陰影 mpl 文檔指出,如果我設置如下:

color = '0.7'

它給了我一個灰色陰影,縮放強度為0.7 我正在從一個數組中讀取顏色的強度,該數組的值介於 0 和 1 之間,每個值對應於散點圖中該點的強度。 我的代碼如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import math

tsne_embeddings = np.load("tsne_embeddings.npy")
labels = np.load('labels.npy')
weights = np.load('weights.npy')
# Scale the weights from 0 to 1
max_weight = max(weights)
min_weight = min(weights)
weights = (weights - min_weight)/(max_weight - min_weight)
print(tsne_embeddings.shape)
x = list(tsne_embeddings[:,0])
y = list(tsne_embeddings[:,1])
labels = list(labels)

weights = np.round(weights,decimals=2)
weights = (np.exp(weights) - 1)/(np.exp(1) - 1)
weights = list(weights)
print(min(weights),max(weights))

for i, shade in enumerate(weights):
    plt.scatter(x[i],y[i],color=shade,marker = '+')

plt.show()

我正在以指數方式縮放這些權重,希望有更好的變化。 所以,基本上,我的問題是:

  1. 如何更改顏色以表示藍色或紅色或綠色的陰影,而不僅僅是灰度?
  2. 我遵循的灰度方法是否正確?

謝謝!

為了使您的方法適用於灰色陰影,您需要將值轉換為字符串,因此plt.scatter(..., color=str(shade))

使用 matplotlib 的更標准的方法是直接使用權重,而不將它們重新縮放到范圍01 ,使用顏色圖,並直接使用數組調用 scatter 。 權重進入c=參數。 對於灰度值,這將是plt.scatter(x, y, c=weights, cmap='Greys', marker='+') matplotlib 的一個附加功能是,有了這些信息,它可以自動創建一個顏色條,將灰度值映射到相應的權重。 如果只創建一個散點圖,不帶參數的plt.colorbar()將顯示此顏色條。

類似的顏色圖存在於“紫色”、“藍色”、“綠色”、“橙色”、“紅色”……請參閱官方文檔和完整列表。 如果明暗范圍錯誤,在名稱后附加“_r”將使用相反的顏色范圍(因此,“Greys”從白色變為黑色,而“Greys_r”從黑色變為白色)。

這是一個工作示例,使用三個數組的 1 到 10 的值:

from matplotlib import pyplot as plt
import numpy as np

x = np.arange(1, 11)
y = np.arange(1, 11)
weights = np.arange(1, 11)
plt.scatter(x, y, c=weights, cmap='Greys', marker='+')
plt.colorbar()
plt.show()

示例圖

您可以在 python 中使用顏色圖來生成不同深淺的藍綠色等https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html我在這里使用藍色顏色圖

import matplotlib.pyplot as plt
import matplotlib as mpl
norm = mpl.colors.Normalize(vmin=min(weights), vmax=max(weights))
cmap = mpl.cm.ScalarMappable(norm=norm, cmap=mpl.cm.Blues)
for i, xi in enumerate(x):
    plt.scatter(x[i],y[i],color=cmap.to_rgba(i+1),marker = '+')
plt.show()

暫無
暫無

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

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