matplotlib - 改变rgba颜色的色调

标签 matplotlib colors

我使用 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 之间的转换,并找出如何一次性完成此操作,但我希望那些知道如何处理颜色的人(我真的不知道)已经找到了简单而高效的方法方法来做到这一点。

如何将给定 RGBA 颜色 A 的色调更改为给定 RGB 颜色 B 的色调,同时保留 A 的 alpha 值?使用不同的颜色模型(例如 HSL)会简化任务吗?如果是的话,这会有帮助吗?

最佳答案

以下是一次性完成所有更换的解决方案:

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

关于您的最后两个问题:

How do I change the hue of a given RGBA color A to that of a given RGB color B while preserving the alpha value of A ?

和:

Would using a different color model (HSL for example) simplify the task, and if so, which would help

我认为您进行此类修改的方法是值得赞赏的,它避免了手动计算(请参阅 HSL and HSV )。使用不同的颜色模型是可能的,HSL 和 HSV 都允许更改色调而不影响其他参数,但这只是另一种方法,而不是更好的方法。

希望这会有所帮助。

关于matplotlib - 改变rgba颜色的色调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074231/

相关文章:

matplotlib - 更改 matplotlib quiver 函数的箭头样式

python - 如何在 Subplot 中绘制多个 Seaborn Jointplot

php - 使用 PHP 检测图像的颜色

java - 将字符串颜色名称转换为颜色值(整数)

ios - 根据滚动逐渐改变背景颜色

Python - 具有 0.99 和 0.999 不同颜色的自定义颜色图

python - 修改绘图轴,使其刻度标签的顺序和它们各自的点相应地改变——而不修改数据本身

python - 如何从字典中制作分组的 fiddle 图

java - Java Swing 中背景的十六进制颜色是什么?

excel - Apache POI 和颜色