如何通过颜色平滑地编码二维位置

How to smoothly encode 2-dimensional location by colors

提问人:Cloudy 提问时间:11/17/2023 最后编辑:Cloudy 更新时间:11/17/2023 访问量:32

问:

在一些网页(link1link2)中,我看到人们用颜色填充 2D 平面:

Example 1 Example 2

但是,这些示例没有源代码。如何在 Python 中生成这样的图?具体来说,如果我有 和 值的数组,我该如何编写一个函数,以便可以生成这样的图?xycolor = f(x, y)scatter(x, y, color)

到目前为止,我已经尝试了以下方法:

import numpy as np
import matplotlib.pyplot as plt

base_x_color = np.array([0.0, 1.0, 0.0])
base_y_color = np.array([1.0, 0.0, 0.0])

x = np.random.rand(100000)
y = np.random.rand(100000)
color = x[:,None] * base_x_color[None,:] + y[:,None] * base_y_color[None,:]

plt.figure()
plt.scatter(x, y, s=5, c=color)
plt.show()

但是,生成的图像(如下所示)始终有一个黑角。我想将所有四个角都设置为非黑色,并在它们之间平滑地过渡。enter image description here

Python 配色方案 颜色理论

评论


答:

0赞 Sash Sinha 11/17/2023 #1

你可以使用 numpy。MeshGrid 实现双线性插值

import numpy as np
import matplotlib.pyplot as plt

resolution = 500 

x = np.linspace(0, 1, resolution)
y = np.linspace(0, 1, resolution)
X, Y = np.meshgrid(x, y)

color_1 = np.array([1.0, 0.0, 0.0])  # Red
color_2 = np.array([0.0, 1.0, 0.0])  # Green
color_3 = np.array([0.0, 0.0, 1.0])  # Blue
color_4 = np.array([1.0, 1.0, 0.0])  # Yellow

color = np.zeros((resolution, resolution, 3))
color += (1 - X)[:, :, None] * (1 - Y)[:, :, None] * color_1[None, None, :]
color += X[:, :, None] * (1 - Y)[:, :, None] * color_2[None, None, :]
color += (1 - X)[:, :, None] * Y[:, :, None] * color_3[None, None, :]
color += X[:, :, None] * Y[:, :, None] * color_4[None, None, :]

plt.figure()
plt.imshow(color, origin='lower', extent=[0, 1, 0, 1])
plt.show()

输出:

colors

0赞 Tấn Nguyên 11/17/2023 #2

根据您的代码,似乎生成的值接近于零,因此是的,您可以使用它来控制低值和高值np.random.randnp.random.uniform

import numpy as np
import matplotlib.pyplot as plt

base_x_color = np.array([0, 1.0, 0.0])
base_y_color = np.array([1.0, 0, 0.0])

x = np.random.uniform(low=0.5, high=0.8, size=(100000,))
y = np.random.uniform(low=0.5, high=0.8, size=(100000,))

color = x[:,None] * base_x_color[None,:] + y[:,None] * base_y_color[None,:]

plt.figure()
plt.scatter(x, y, s=5, c=color)
plt.show()

enter image description here