Matlab:一维数组到带颜色图的 RGB 三元组

Matlab: 1D array to RGB triplets with colormap

我正在尝试绘制一组矩形,每个矩形的填充颜色代表 0 到 1 之间的某个值。理想情况下,我想使用任何标准颜色图。

请注意,矩形未放置在漂亮的网格中,因此使用 imagescsurf 或类似方法似乎不切实际。此外,scatter 函数似乎不允许我分配自定义标记形状。因此,我坚持在 for 循环中绘制一堆矩形并手动分配 FillColor

从标量值计算 RGB 三元组的最有效方法是什么?我一直无法找到符合 [r,g,b] = val2rgb(value,colormap). 的函数 现在,我已经构建了一个函数来计算 'jet' 值,在检查 rgbplot(jet) 之后。这似乎有点傻。当然,我可以通过插值从任意颜色图中获取值,但这对于大型数据集来说会很慢。

那么,高效的 [r,g,b] = val2rgb(value,colormap) 是什么样的?

您有另一种方法来处理它:使用 patch or fill 指定色标值 C 作为第三个参数来绘制矩形。然后你可以添加和调整颜色条:

x = [1,3,3,1,1];
y = [1,1,2,2,1];
figure
for ii = 1:10
    patch(x + 4 * rand(1), y + 2 * rand(1), rand(1), 'EdgeColor', 'none')
end
colorbar

有了这个输出:

我认为 erfan 的补丁解决方案比我的矩形方法更加优雅和灵活。

无论如何,对于那些寻求将标量转换为 RGB 三元组的人,我将添加我对这个问题的最后想法。我解决这个问题的方法是错误的:颜色应该从颜色图中最接近的匹配中提取,而不进行插值。解决方案变得微不足道;我为将来偶然发现此问题的人添加了一些代码。

% generate some data
x = randn(1,1000);

% pick a range of values that should map to full color scale
c_range = [-1 1];

% pick a colormap
colormap('jet');

% get colormap data
cmap = colormap;

% get the number of rows in the colormap
cmap_size = size(cmap,1);

% translate x values to colormap indices
x_index = ceil( (x - c_range(1)) .* cmap_size ./ (c_range(2) - c_range(1)) );

% limit indices to array bounds
x_index = max(x_index,1);
x_index = min(x_index,cmap_size);

% read rgb values from colormap
x_rgb = cmap(x_index,:);

% plot rgb breakdown of x values; this should fall onto rgbplot(colormap)
hold on;
plot(x,x_rgb(:,1),'ro');
plot(x,x_rgb(:,2),'go');
plot(x,x_rgb(:,3),'bo');
axis([c_range 0 1]);
xlabel('Value');
ylabel('RGB component');

结果如下: