我在矩阵中有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种不同的颜色,但不是从头到尾)?
答案 0 :(得分:2)
您所谈论的主要是ColorOrder
属性(而不是图中的colormap
)。
上面给出的colororder
的链接将向您解释如何强制Matlab为所有绘图使用给定的颜色集。它对plot
完全正常。您不需要循环,只需在绘图之前定义图的DefaultColororder
属性,然后在一次调用中绘制所有系列,Matlab将根据您之前定义的顺序分配每个绘图的颜色。 / p>
对于mesh
和hist
,不幸的是,它不是那么简单,因此您必须运行循环来指定颜色或每个图形对象。要在创建图形对象属性(如颜色)后进行修改,必须使用set
方法,如果使用的是Matlab版本> = 2014b,则必须使用直接点表示法。对于这两种方法,您需要拥有图形对象的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
请告诉你下图:
答案 1 :(得分:0)
更新:原始问题
有没有办法为所有绘图类型设置相同的颜色图,或为每个颜色图指定一个?
这个答案,用色彩映射回答这个问题,在字面上用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
的使用的详尽信息。