Matlab中的Colorbar轴刻度

3
我正在使用以下代码
d3 = vals;
n = datesmonth;
figure
plot(n,d3);
colormap(jet(12));
hold on
plot(n, d3,'b-');
scatter(n, d3, [], RiskierInd, 'filled');
caxis([1 12]);
colorbar('YTick',[1:12],...
         'YTickLabels',{'Non-Durables','Durables','Manufacturing','Oil, Gas and Coal ','Chemicals','Technology','Telephone & TV','Utilities','Wholesale and Retail','Health','Finance','Other'})
datetick('x','mm-yyyy')

要生成这个图形

enter image description here

我有两个快速问题:

  1. 是否可以将每种颜色的颜色条字符串条目居中?例如,条目“非耐用品”不应位于颜色条的底部,而应位于最深蓝色类别的中间。

  2. 是否可以手动选择每个类别的颜色?

2个回答

1
对于您的第一个问题,您可以简单地修改以下内容:
caxis([0.5 12.5]);

我不确定是否理解你的第二个问题,但我想说没有简单的方法。


1
Ratbert已经基本回答了第一个问题。但是为了完整起见,只需执行此操作并替换当前的caxis调用:
caxis([0.5 12.5]);

回答第二个问题,是的,可以。
如果您在代码中注意到,您从 jet 主题生成了一个由12个组件构成的颜色映射。这将产生一个 12 x 3 的矩阵,其中每一行都是一个唯一的颜色。因此,如果您想手动选择颜色,只需重新排列颜色的顺序即可。如果您查看绘图中的颜色条标签,第一种颜色从底部开始,即蓝色,然后向上推进到红色。
作为参考,这是 jet(12) 生成的矩阵:
>> cmap = jet(12)

cmap = 

     0         0    0.6667
     0         0    1.0000
     0    0.3333    1.0000
     0    0.6667    1.0000
     0    1.0000    1.0000
0.3333    1.0000    0.6667
0.6667    1.0000    0.3333
1.0000    1.0000         0
1.0000    0.6667         0
1.0000    0.3333         0
1.0000         0         0
0.6667         0         0

每一行都包含一个唯一的RGB元组,其中第一列表示红色的数量,第二列表示绿色的数量,第三列表示蓝色的数量。因此,前几个颜色是纯蓝色的,然后在此基础上逐步添加绿色色调,以形成青色等等。
矩阵被排列成这样,第一个颜色是第一行,最后一个颜色是最后一行。如果您想决定哪些标签需要哪些颜色,则只需重新排列行,使其与所需标签匹配即可。
因此,您有一组标签:
labels = {'Non-Durables','Durables','Manufacturing','Oil, Gas and Coal ','Chemicals','Technology','Telephone & TV','Utilities','Wholesale and Retail','Health','Finance','Other'};

... 目前,您有一个颜色地图中出现的颜色顺序:

cmap = jet(12);
order = [1 2 3 4 5 6 7 8 9 10 11 12]; %// or order = 1:12;
cmap = cmap(order,:);

你只需要改变order的值,就可以让正确的颜色按照正确的顺序出现。因此,请查看图像中的颜色条,并将每种颜色的位置排列,使其符合order的相同位置。例如,如果你想要颜色顺序反转,你可以这样做:
cmap = jet(12);
order = [12 11 10 9 8 7 6 5 4 3 2 1]; %// or order = 12:-1:1;
cmap = cmap(order,:);

同样地,如果您希望黄色和青色先出现,其余颜色在之后出现,您可以执行以下操作:
cmap = jet(12);
order = [8 4 5 6 7 1 2 3 9 10 11 12];
cmap = cmap(order,:); 

一旦您这样做了,就在cmap上调用colormap并继续绘图:
%// From before
cmap = jet(12);
order = [4 5 6 8 7 1 2 3 9 10 11 12];
cmap = cmap(order,:); 

%// New
colormap(cmap);
hold on
plot(n, d3,'b-');
scatter(n, d3, [], RiskierInd, 'filled');
caxis([0.5 12.5]); %// Change
colorbar('YTick',[1:12],...
         'YTickLabels',{'Non-Durables','Durables','Manufacturing','Oil, Gas and Coal ','Chemicals','Technology','Telephone & TV','Utilities','Wholesale and Retail','Health','Finance','Other'})
datetick('x','mm-yyyy')

然而,如果你想手动选择颜色,那会比较复杂。你只需要知道你想要的颜色,然后将它们放入矩阵中。记住,每个颜色都是一个RGB元组,放在单独的一行中。但你需要查看调色板以了解每个组件应该被加权为何以获得正确的颜色。
点击这里:http://colorpicker.com - 你可以选择你想要的确切颜色并记录RGB值。之后,将每个值除以255,并将其作为颜色映射矩阵中的一个条目。每种颜色都是一行,其中第一列是红色,第二列是绿色,第三列是蓝色。这是如果你真的想控制每个类别所对应的颜色。你需要确定红色、绿色和蓝色值的正确组合。
祝你好运!

1
这并不是我对“手动选择颜色”的理解。你的解决方案 - 顺便说一下,完全正确和有趣 - 更多地涉及“计算重新排列”颜色。虽然我可能错了,但如果OP对你的解决方案感到满意,那我就没有更多可说的了! - Ratbert
1
@Ratbert - 这确实是真的。不过,那是我理解的方式。让我看看原帖作者对此有何说法...感谢您的评论 :) - rayryeng
能够精确选择颜色会很好,但我对提供的解决方案感到满意。非常感谢你们两位的帮助! - phdstudent
你可以做到这一点。你只需要知道你想要哪些颜色,然后将它们放入矩阵中。记住,每种颜色都是一个RGB元组,并且放置在单独的一行中。但是,你需要查看一个颜色选择器,以了解每个组件应该加权为何才能得到正确的颜色。感谢你的接受! - rayryeng
1
@volcompt - 根据我的评论,您可以访问此网站:http://www.colorpicker.com/ - 您可以选择您想要的确切颜色并记录RGB值。然后,将每个值除以255,并将其作为颜色映射矩阵中的条目。每种颜色都是一行,其中第一列是红色,第二列是绿色,第三列是蓝色。如果您真的想控制哪种颜色与哪种类别相匹配,那么您必须确定正确的红色,绿色和蓝色值的组合。祝你好运! - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接