我在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