我想采样从绿色到蓝色插值的RGB或HSV颜色。但是,我希望高斯的平均值应该是绿色的,以便该组的大部分将由绿色支配。最后,我想实现这一点,当你从绿色到蓝色或红色进行插值时,你开始偏离人群。像这样的东西,但大多数应该是绿色的..
答案 0 :(得分:0)
以下是一个选项 您首先需要一个绿色的色彩图。如果可用的standard colormaps都不适合您,您可以构建自己的色彩映射表。在最简单的情况下,它将由三种颜色(蓝色,绿色,红色)组成
colors = ["blue", "green", "red"]
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("name", colors)
然后,您可以使用标准化实例,其中心位于正态分布的中心。在这里我们选择它为0;因此,归一化限制需要关于零对称。
norm = matplotlib.colors.Normalize(vmin=-3, vmax=3)
现在,拥有正常的分布式变量x
,您可以从色彩映射中采样
sample = cmap(norm(x))
为了绘制此图,请在下面找到完整的示例:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
n = 600
x = np.random.normal(size=n)
y = np.random.rand(n)
colors = ["blue", "green", "red"]
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("name", colors)
norm = matplotlib.colors.Normalize(vmin=-3, vmax=3)
fig, (ax, ax2) = plt.subplots(nrows=2, figsize=(6,3),
gridspec_kw={"height_ratios":[1,3]}, sharex=True)
ax.axis("off")
ax.hist(x, bins=21, edgecolor="k")
sc = ax2.scatter(x,y,s=15, c=x, cmap=cmap, norm=norm)
fig.colorbar(sc, ax=ax2)
cax = fig.colorbar(sc, ax=ax)
cax.ax.set_visible(False)
plt.show()
答案 1 :(得分:0)
这可以使用HSV色彩空间来实现,其中纯绿色在H = 120度。您可以在以num
为中心的mean
点的H-V空间中创建双变量正态分布,并根据协方差矩阵cov
分布:
import numpy as np
num = 1000
mean = [120,0.5] # [hue,value]
cov = [[20,0],[0,0.01]]
hv = np.random.multivariate_normal(mean,cov,num)
接下来,我们对矩阵进行模数处理,以便将超出边界的点循环回来:
hv[:,0] %= 360
hv[:,1] %= 1
接下来,我们借用here在HS空间中创建一个RGB地图(V = 1):
from matplotlib.colors import hsv_to_rgb
import matplotlib.pyplot as plt
V, H = np.mgrid[0:1:100j, 0:1:300j]
S = np.ones_like(V)
HSV = np.dstack((H,S,V))
RGB = hsv_to_rgb(HSV)
plt.imshow(RGB, origin="lower", extent=[0, 360, 0, 1], aspect=150)
最后,将我们的分布覆盖到H-S空间:
plt.scatter(hv[:,0],hv[:,1])
plt.show()
您可以使用cov
来实现所需的分发。例如,cov = [[80,0.7],[0.1,0.006]]
给了我们
此外,您可以轻松地将此示例扩展为三维,以考虑饱和度的变化。