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 将根据您的顺序分配每个绘图的颜色较早定义。
对于 mesh
和 hist
不幸的是,它并不是那么简单,因此您将不得不 运行 一个循环来指定颜色或每个图形对象。要在创建后修改图形对象 属性(如颜色),您必须使用 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
会给你下图:
我在一个矩阵中有 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 将根据您的顺序分配每个绘图的颜色较早定义。
对于 mesh
和 hist
不幸的是,它并不是那么简单,因此您将不得不 运行 一个循环来指定颜色或每个图形对象。要在创建后修改图形对象 属性(如颜色),您必须使用 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
会给你下图: