Matlab:一维数组到带颜色图的 RGB 三元组
Matlab: 1D array to RGB triplets with colormap
我正在尝试绘制一组矩形,每个矩形的填充颜色代表 0 到 1 之间的某个值。理想情况下,我想使用任何标准颜色图。
请注意,矩形未放置在漂亮的网格中,因此使用 imagesc
、surf
或类似方法似乎不切实际。此外,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');
结果如下:
我正在尝试绘制一组矩形,每个矩形的填充颜色代表 0 到 1 之间的某个值。理想情况下,我想使用任何标准颜色图。
请注意,矩形未放置在漂亮的网格中,因此使用 imagesc
、surf
或类似方法似乎不切实际。此外,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');
结果如下: