Matlab:带有colormap的1D数组到RGB三元组

时间:2016-10-15 09:58:04

标签: matlab colormap

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

请注意,矩形不会放在漂亮的网格中,因此使用imagescsurf或类似内容似乎不切实际。此外,scatter功能似乎不允许我分配自定义标记形状。因此,我不得不在for循环中绘制一堆矩形并手动分配FillColor

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

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

2 个答案:

答案 0 :(得分:1)

您还有另一种方法可以处理它:使用patchfill绘制矩形,指定色阶值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

使用此输出:

enter image description here

答案 1 :(得分:1)

我认为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');

具有以下结果: RGB components calculated from scalar values using the 'jet' colormap