2015-05-06 180 views
12

我正在使用RGBA顏色在matplotlib中繪製一堆數據作爲散點圖(以防介質相關)。我希望能夠做的是,一旦我繪製了所有內容,我想挑選出各個散點,並將它們的色調更改爲某種RGB顏色的色調,但保留舊的Alpha值。我現在做的方式是這樣的:改變rgba顏色的色調

oldHSV = rgb_to_hsv(oldRGBA[:3]) 
newHSV = rgb_to_hsv(newRGB) 
oldHSV[0] = newHSV[0] 
newRGBA = hsv_to_rgb(oldHSV).tolist() + [oldRGBA[3]] 

即我老拿RGBA值的RGB部分,把它轉化爲HSV,新預期RGB顏色做的一樣,然後更換色調,將其回到RGB並添加舊的alpha值。

由於我這樣做了幾千次,這可能比我想要花費的時間要長得多。一個可能的解決方法是深入研究RGB和HSV之間的轉換,並找出如何一次完成此操作,但我希望那些知道如何處理顏色的人(我真的不知道)已經找到了簡單而有效的方法如何做到這一點。

如何將給定RGBA顏色A的色調更改爲給定RGB顏色B的色調,同時保留A的alpha值?會使用不同的顏色模型(例如HSL)來簡化任務,如果是這樣,哪些會有所幫助?

回答

5

這裏是做所有的更換一次過解決辦法:

import matplotlib.colors as clr 
import matplotlib.pyplot as plt 
import numpy as np 


N = 100000 
x = 1.2 + 800.0 * np.random.rand(N) 
y = 1.2 + 800.0 * np.random.rand(N) 
# Generate random colors of the form (r, g, b, a) where r = 0.0 
colors = np.random.rand(4 * N).reshape((N, 4)) 
colors[:, 0] = 0.0 
area = np.pi * (5 * np.random.rand(N))**2 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 
pcol = ax.scatter(x, y, s=area, c=colors) 
ax.set_xscale('log') 
ax.set_yscale('log') 

# Save initial figure 
plt.savefig("hue.jpg") 

oldRGBA = pcol.get_facecolors().reshape((N, 1, 4)) 
oldRGB = oldRGBA[:, :, :3] 
newRGB = oldRGB 
newRGB[:, :, 0] = 1.0 # Set red component to 1.0 
oldHSV = clr.rgb_to_hsv(oldRGB) 
newHSV = clr.rgb_to_hsv(newRGB) 
oldHSV[:, :, 0] = newHSV[:, :, 0] 
newRGBA = np.copy(oldRGBA) 
newRGBA[:, :, :3] = clr.rgb_to_hsv(oldHSV) 
pcol.set_facecolors(newRGBA[:, 0, :]) 

# Save modified figure 
plt.savefig("hue_bis.jpg") 

plt.close() 

正如你所看到的,這個代碼試圖繪製100000點,其實它成功地做到這一點,大約2秒鐘。這裏的數字產生:

hue.jpg

和:

hue_bis.jpg

關於你的最後兩個問題:

如何改變一個給定的RGBA的色調色彩A與給定的RGB色彩B的色彩同時保留A的α值?

和:使用

將不同的顏色模式(HSL例如)簡化任務,如果是這樣,這將有助於

我覺得你的方法做這樣的一個修改是可觀的,它避免了手工計算(見HSL and HSV)。使用不同的顏色模型是可能的,HSL和HSV都可以在不影響其他參數的情況下改變色調,但這只是另一種方式,而不是更好的方法。

希望這會有所幫助。

+1

這很有趣;雖然沒有提供一種方法來提高代碼的性能,但它給了我一個觀察其他人的代碼如何去實現(並且我的代碼不會更慢)的觀點。 –

+0

哦!我預計一次性會有更好的表現。我會仔細觀察一下。你有工作的代碼實現你的解決方案,並允許我自己節省時間嗎? – Flabetvibes

+0

不幸的是,我沒有;我的代碼位於數據可視化工具中,我認爲改變色調可能是我應用於可視化的操作之一的瓶頸。我無法真正提取它,它沒有寫得夠高雅。但實際上,你的回答基本上回答了我的問題:這實際上是一個瓶頸,我能更快地處理東西嗎?原來,顯然不是,所以現在我可以轉向其他潛在的問題。 –

1

它應該能夠從oldRGBA提取阿爾法並將其應用到newRGB直接:

newRGBA = colors.to_rgba(newRGB, alpha=oldRGBA[3]) 

注:我沒有用過matplotlib,我假定阿爾法分量是顏色的第四元件