如何在Matlab中制作具有30种可区分颜色的颜色图

时间:2019-07-22 06:46:26

标签: matlab colors matlab-figure colormap

我在Matlab中为绘图创建了代码,请参见下文。我的问题是,对于许多数据向量(即不仅收入和运营支出,而且最多30个数据系列),颜色非常相似。如果您不问我为什么要绘制30种颜色并假设我有一个会占用太多空间来详细解释的原因,我将不胜感激。

我的问题是,...

1)如何为多达30个不同的数据系列创建非线性颜色图?非线性,我只是表示颜色必须尽可能不同才能区分它们。随时提出更好的建议。

请注意,这不是重复的操作:

a)this entry,因为那里的人只建议7种不同的颜色。

b)or this entry,因为那里的人建议使用20种不同的颜色(“凯利”(Kelly)),并指出“请注意某些黄色不是很鲜明”。

我在线找到了一个Matlab函数,该函数可能会有所帮助,请参见下文。但您也可以建议其他方法。关于功能,到目前为止我还不清楚两点:

2)输入变量myColors,centerPoint,cLim,scalingIntensity和inc的格式(类和大小)必须是什么(请参见下文)?例如。我知道cLim必须是2x1向量; centerPoint,scaleIntensity数值。

3)这些变量的合理值是多少,即代码在什么范围内才能起作用?

我的代码:

clc
clear
close all

revenue = ones(100,1);
opex = -1*ones(100,1);
opex(10:15,1) = 3;

data{1} = revenue;
data{2} = opex;
colors = parula(numel(data));
labels = {'Revenue','Opex'};
for i = 1:numel(data)
    dataNeg{i} = data{i};
    dataNeg{i}(data{i}>0) = 0;
    dataPos{i} = data{i};
    dataPos{i}(data{i}<0) = 0;
    mdata(i) = nnz(dataPos{i});  % was: mean(data{i});
end;
[~,posOrder] = sort(mdata,'ascend');
[~,negOrder] = sort(mdata,'descend');
yDataPos = [dataPos{posOrder}];
yDataNeg = [dataNeg{negOrder}];
hold on;
bNeg = bar(yDataNeg,'stack');
bPos = bar(yDataPos,'stack');
for i= 1:numel(data)
    set(bNeg(i),'FaceColor',colors(negOrder(i),:))
    set(bPos(i),'FaceColor',colors(posOrder(i),:))
end;
legend(labels{:});
hold off;

非线性彩色图的功能:

function [newMap, ticks, tickLabels] = MC_nonlinearCmap(myColors, centerPoint, cLim, scalingIntensity, inc)
    dataMax = cLim(2);
    dataMin = cLim(1);
    nColors = rows(myColors);
    colorIdx = 1:rows(myColors);
    colorIdx = colorIdx - (centerPoint-dataMin)*numel(colorIdx)/(dataMax-dataMin); % idx wrt center point
    colorIdx = scalingIntensity * colorIdx/max(abs(colorIdx));  % scale the range
    colorIdx = sign(colorIdx).*colorIdx.^2;
    colorIdx = colorIdx - min(colorIdx);
    colorIdx = colorIdx*nColors/max(colorIdx)+1;
    newMap = interp1(colorIdx, myColors, 1:nColors);
      if nargout > 1
          % ticks and tickLabels will mark [centerPoint-inc, ... centerPoint+inc, centerPoint+2*inc]
          % on a linear color bar with respect the colors corresponding to the new non-linear colormap
          linear_cValues = linspace(cLim(1), cLim(2), nColors);
          nonlinear_cValues = interp1(1:nColors, linear_cValues, colorIdx);
          tickVals = fliplr(centerPoint:-inc:cLim(1));
          tickVals = [tickVals(1:end-1), centerPoint:inc:cLim(2)];
          ticks = nan(size(tickVals));
          % find what linear_cValues correspond to when nonlinear_cValues==ticks
          for i = 1:numel(tickVals)
              [~, idx] = min(abs(nonlinear_cValues - tickVals(i)));
              ticks(i) = linear_cValues(idx);
          end
          tickLabels = arrayfun(@num2str, tickVals, 'Uniformoutput', false);
      end
  end

0 个答案:

没有答案