Matlab:hist、plot 和 mesh 的相同颜色图

Matlab: same colormap for hist, plot and mesh

我在一个矩阵中有 5 个不同频率的数据集,我想使用 plot、hist 和 mesh 来说明它们。但是,每种绘图类型都使用不同的颜色图(见图),因此我需要为每个绘图添加一个图例。

有没有办法为所有绘图类型设置相同的颜色图,或者为每种绘图类型指定一个颜色图?另一件奇怪的事:例如,我可以使用图形工具为 hist 设置颜色图,但不能为普通 plot 设置颜色图。对于网格我必须使用 hold on 循环,所以我想在这里设置颜色与定义颜色图不同?

编辑:

这是一个最小的例子。它仍然无法正常工作,请参阅下面代码中的注释。

clear all;
close all;
clc;

% make up some data with the original format
freqLen = 5;
data = zeros(10, 3, 3, freqLen);
data(:, :, :, 1) = rand(10, 3, 3);
data(:, :, :, 2) = rand(10, 3, 3)+1;
data(:, :, :, 3) = rand(10, 3, 3)+2;
data(:, :, :, 4) = rand(10, 3, 3)+3;
data(:, :, :, 5) = rand(10, 3, 3)+4;
% reshape data so we get a vector for each frequency
dataF = reshape(data, [10*3*3, freqLen]);

% prepare colors for plot, try to get 5 colors over the range of colormap
% but I get wrong colors using both methods below!
%cols = colormap(jet);
%cols = cols(1:round(length(cols)/length(freqGHz)):end, :);
cols = jet(freqLen);

% plot samples in 3D
figure('Position', [0 0 1000 1000]);
subplot(211);
hold on;
for iF = 1:freqLen
    dataThisF = dataF(:, iF);
    data3D = reshape(dataThisF, [10*3, 3]);
    mesh(data3D);
    % try to give each "holded" mesh a different color. Not working!
    % after the loop, all meshes have the last color
    set(get(gca, 'child'), 'FaceColor', 'w', 'EdgeColor', cols(iF, :));
end
view(60, 20);

% plot samples
subplot(223);
hold on;
for iF = 1:freqLen
    % the loop is not avoidable
    % because matlab maps the colors wrong when plotting as a matrix
    % at least its not using the colormap colors
    plot(dataF(:, iF), 'Color', cols(iF, :));
end

% plot histogram
subplot(224);
% actually the only one which is working as intended, horray!
hist(dataF, 50);

我怎样才能给一个固定的网格一个单一的颜色,与其他的不同?在使用简单的线图绘制矩阵时如何映射正确的喷射颜色图,或者至少从喷射颜色图中获得 5 种颜色(jet(5) 给出 5 种不同的颜色,但不是从头到尾)?

更新:原问题问

Is there a way to set the same colormap for all plot types, or specify one for each of them?

这个答案,用颜色图回答了那个问题,在 MATLAB 中的字面意思是 colormap


您可以使用 colormap 设置图形的颜色图。您可以使用众多内置颜色图之一或指定您自己的颜色图。


使用 mesh 和内置 hsv 颜色图的示例可以是

figure;
mesh(data);
colormap(hsv);

这将应用基于

的颜色图

给你图。您还可以创建自己的颜色图,例如

map = [1, 0, 0,
       1, 1, 1,
       0, 1, 0,
       0, 0, 0];
colormap(map);

这将创建一个颜色图,颜色为红色白色蓝色黑色.


MATLAB 文档包含有关 colormap.

使用的大量信息

你说的主要是ColorOrder属性(而不是图中的colormap

上面给出的 colororder 的 link 将向您解释如何强制 Matlab 对所有绘图使用一组给定的颜色。它在 plot 上工作得很好。您不需要循环,只需在绘图之前定义图形的 DefaultColororder 属性 然后在一次调用中绘制所有系列,Matlab 将根据您的顺序分配每个绘图的颜色较早定义。

对于 meshhist 不幸的是,它并不是那么简单,因此您将不得不 运行 一个循环来指定颜色或每个图形对象。要在创建后修改图形对象 属性(如颜色),您必须使用 set 方法,如果您使用的是 >= 2014b 的 Matlab 版本,甚至可以直接使用点符号.对于这两种方法,您都需要拥有图形对象的 handle,因此通常最简单的方法就是在创建时检索图形对象句柄*。

* 而不是像 get(gca, 'child') 这样的肮脏黑客。这很容易出错,事实上你的情况是错误的。您的代码无法正确着色,因为您没有以这种方式获得正确的图形句柄。

下面的代码绘制所有图形,检索每个图形对象的句柄,然后在最后一个循环中分配颜色。


%// Get a few colors
cols = jet(freqLen);

% plot samples in 3D
figure('Position', [0 0 1000 1000]);
set( gcf , 'DefaultAxesColorOrder',cols) %// set the line color order for this figure

subplot(2,1,1,'NextPlot','add');         %// 'NextPlot','add' == "hold on" ;
for iF = 1:freqLen
    dataThisF = dataF(:, iF);
    data3D = reshape(dataThisF, [10*3, 3]);
    h.mesh(iF) = mesh(data3D) ;         %// plot MESH and retrieve handles

    %// You can set the color here direct, or in the last final "coloring" loop
    %// set( h.mesh(iF) , 'FaceColor', 'w', 'EdgeColor', cols(iF, :));
end
view(60, 20);

%// plot samples
subplot(223);
h.plots = plot(dataF);                  %// plot LINES and retrieve handles

%// plot histogram
subplot(224);
[counts,centers] = hist(dataF, 50 ) ;   %// get the counts values for each series
h.hist = bar(centers,counts) ;          %// plot HISTOGRAM and retrieve handles

%// now color every series with the same color
for iF = 1:freqLen
    thisColor = cols(iF, :) ;
    set( h.mesh(iF)  , 'EdgeColor' , thisColor  , 'FaceColor', 'w' );
    set( h.hist(iF)  , 'EdgeColor' , thisColor  , 'FaceColor' , thisColor )
    %// this is actually redundant, the colors of the plots were already right from the
    %// beginning thanks to the "DefaultColorOrder" property we specified earlier
    set( h.plots(iF) , 'Color'     , thisColor ) 
end

会给你下图: