我正在尝试绘制一组矩形,每个矩形的填充颜色代表0到1之间的某个值。理想情况下,我想使用任何标准颜色图。
请注意,矩形不会放在漂亮的网格中,因此使用imagesc
,surf
或类似内容似乎不切实际。此外,scatter
功能似乎不允许我分配自定义标记形状。因此,我不得不在for循环中绘制一堆矩形并手动分配FillColor
。
从标量值计算RGB三元组的最有效方法是什么?我一直无法找到[r,g,b] = val2rgb(value,colormap).
行的功能。现在,在检查rgbplot
(jet)之后,我已经构建了一个计算'jet'值的函数。这看起来有点傻。当然,我可以通过插值从任意颜色图中获取值,但对于大型数据集来说这会很慢。
那么,效率[r,g,b] = val2rgb(value,colormap)
会是什么样的呢?
答案 0 :(得分:1)
您还有另一种方法可以处理它:使用patch
或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
使用此输出:
答案 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');