我使用RGBA颜色在matplotlib中绘制一组数据作为散点图(仅在媒体相关的情况下)。我想要做的是,一旦我绘制了所有内容,我想挑选出单独的散点并将其色调更改为某些RGB颜色的色调,但保留旧的alpha值。我目前这样做的方式是:
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之间的转换并找出如何一次性完成这项工作,但我希望那些知道如何处理颜色的人(我真的不知道)已经弄清楚了和有效的方法来做到这一点。
如何在保留A的alpha值的同时将给定RGBA颜色A的色调更改为给定RGB颜色B的色调?使用不同的颜色模型(例如HSL)会简化任务,如果是这样,哪个会有用?
答案 0 :(得分: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秒内完成此操作。以下是制作的数据:
和:
关于你的最后两个问题:
如何将给定RGBA颜色A的色调更改为给定RGB颜色B的色调,同时保留A的alpha值?
和:
使用不同的颜色模型(例如HSL)会简化任务,如果是,那将有助于
我认为你做这种修改的方法很明显,它避免了手工计算(见HSL and HSV)。使用不同的颜色模型是可能的,HSL和HSV都允许在不影响其他参数的情况下改变色调,但这只是另一种方法,而不是更好的方法。
希望这会有所帮助。
答案 1 :(得分:1)
应该可以从oldRGBA
中提取alpha并直接将其应用于newRGB
:
newRGBA = colors.to_rgba(newRGB, alpha=oldRGBA[3])
注意:我从未使用过matplotlib,我认为alpha组件是颜色的第4个元素