gpt4 book ai didi

python - 如何在 matplotlib 中插入颜色以使其数量加倍

转载 作者:行者123 更新时间:2023-12-05 05:59:47 28 4
gpt4 key购买 nike

我有一个像这样的 9 种颜色的列表:

  colors = [
[0, 82, 246, 255],
[0, 196, 196, 255],
[0, 137, 83, 255],
[1, 233, 11, 255],
[234, 255, 31, 255],
[255, 176, 0, 255],
[247, 19, 0, 255],
[193, 0, 76, 255],
[255, 0, 255, 255]]

我想使用 matplotlib 将插值颜色的数量加倍。我使用了 LinearSegmentedColormap.from_list 但没有成功:

  cm = LinearSegmentedColormap.from_list('test', np.array(colors) / 255, 
N=len(colors))

colors = cm(np.linspace(0, 1, 2 * len(colors)))
colors = (colors * 255).astype('uint8')

但是我得到了相同的颜色但重复了:

array([[  0,  82, 246, 255],
[ 0, 82, 246, 255],
[ 0, 196, 196, 255],
[ 0, 196, 196, 255],
[ 0, 137, 83, 255],
[ 0, 137, 83, 255],
[ 1, 233, 11, 255],
[ 1, 233, 11, 255],
[234, 255, 31, 255],
[234, 255, 31, 255],
[255, 176, 0, 255],
[255, 176, 0, 255],
[247, 18, 0, 255],
[247, 18, 0, 255],
[193, 0, 76, 255],
[193, 0, 76, 255],
[255, 0, 255, 255],
[255, 0, 255, 255]], dtype=uint8)

我怎样才能得到预期的行为,使用我原来的颜色,加上中间的其他颜色?

最佳答案

您的“预期”行为是不可能的:如果您有 9 种颜色,并且采用 18 个等距插值,则只有第一个和最后一个值来自您的初始集。要将您的初始集合作为列表的一部分,您需要一个倍数减一。

LinearSegmentedColormap.from_list() 的输入不能是 0-255 范围内的 rgb 值:它们必须是 0-1 范围内的浮点值。此外,N= 参数将是内部存储值的数量。如果将 N 设置为等于原始颜色数,则不会计算任何插值颜色。为了获得最大的灵 active ,您可以将 N 设置为 256。

之后,您可以再次将这些值乘以 255 以获得 0-255 范围内的 rgb 值。

from matplotlib.colors import LinearSegmentedColormap
import numpy as np

colors = [[0, 82, 246, 255],
[0, 196, 196, 255],
[0, 137, 83, 255],
[1, 233, 11, 255],
[234, 255, 31, 255],
[255, 176, 0, 255],
[247, 19, 0, 255],
[193, 0, 76, 255],
[255, 0, 255, 255]]

cm = LinearSegmentedColormap.from_list('', np.array(colors) / 255, 256)
colors_18 = (cm(np.linspace(0, 1, len(colors) * 2)) * 255).astype(np.uint8)
colors_17 = (cm(np.linspace(0, 1, len(colors) * 2 - 1)) * 255).astype(np.uint8)

colors_18:

array([[  0,  82, 246, 255],
[ 0, 135, 222, 255],
[ 0, 189, 198, 255],
[ 0, 171, 149, 255],
[ 0, 143, 96, 255],
[ 0, 170, 57, 255],
[ 0, 216, 23, 255],
[ 69, 239, 16, 255],
[179, 249, 26, 255],
[238, 236, 23, 255],
[248, 199, 9, 255],
[253, 148, 0, 255],
[249, 74, 0, 255],
[240, 16, 8, 255],
[215, 7, 44, 255],
[196, 0, 86, 255],
[225, 0, 170, 255],
[255, 0, 255, 255]], dtype=uint8)

colors_17:

array([[  0,  82, 246, 255],
[ 0, 139, 220, 255],
[ 0, 195, 195, 255],
[ 0, 166, 138, 255],
[ 0, 137, 82, 255],
[ 0, 185, 46, 255],
[ 3, 233, 11, 255],
[120, 244, 21, 255],
[234, 253, 30, 255],
[244, 214, 14, 255],
[254, 172, 0, 255],
[250, 94, 0, 255],
[245, 18, 1, 255],
[218, 9, 39, 255],
[194, 0, 80, 255],
[225, 0, 170, 255],
[255, 0, 255, 255]], dtype=uint8)

为了在其他应用程序中使用颜色,matplotlib 还提供了一个to_hex 函数(它不适用于数组,只能用于单个颜色):

from matplotlib.colors import to_hex
colors_18_hex = [to_hex(cm(v)) for v in np.linspace(0, 1, len(colors) * 2)]
# ['#0052f6', '#0088de', '#00bdc7', '#00ac95', '#009060', '#00ab3a', '#01d818', '#46ef11', '#b3fa1a', '#efec18', '#f9c709', '#fe9400', '#fa4a00', '#f11109', '#d7082d', '#c50057', '#e200ab', '#ff00ff']"

这是一个图表,展示了插值是如何进行的:

from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import numpy as np

colors = np.array([[0, 82, 246, 255], [0, 196, 196, 255], [0, 137, 83, 255], [1, 233, 11, 255], [234, 255, 31, 255], [255, 176, 0, 255], [247, 19, 0, 255], [193, 0, 76, 255], [255, 0, 255, 255]])

fig, axs = plt.subplots(nrows=3, figsize=(15, 5))

plt.colorbar(ScalarMappable(cmap=LinearSegmentedColormap.from_list('', colors / 255, len(colors))),
ticks=np.linspace(0, 1, len(colors)), orientation='horizontal', cax=axs[0])
axs[0].set_title("9 colors, no interpolation")

plt.colorbar(ScalarMappable(cmap=LinearSegmentedColormap.from_list('', colors / 255, 256)),
ticks=np.linspace(0, 1, len(colors) * 2 - 1), orientation='horizontal', cax=axs[1])
axs[1].set_title("positions of 17 colors")
axs[1].xaxis.grid(True, ls='--')

plt.colorbar(ScalarMappable(cmap=LinearSegmentedColormap.from_list('', colors / 255, 256)),
ticks=np.linspace(0, 1, len(colors) * 2), orientation='horizontal', cax=axs[2])
axs[2].set_title("positions of 18 colors")
axs[2].xaxis.grid(True, ls='--')

plt.tight_layout()
plt.show()

linear segmented colormap from list

关于python - 如何在 matplotlib 中插入颜色以使其数量加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67984124/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com