필터 지우기
필터 지우기

How to apply a 'custom' colormap to multiple data sets including negative and positive values

조회 수: 4 (최근 30일)
Hi everyone,
Got an issue I've been working on for the last few weeks and cannot figure it out.
I got several datasets that I plot individually across the x-axis. I want to apply the colormap to the filled plot dots to reflect the colormap (ie negative data plots are blue, positive are red and anything around 0 is white/pale).
My problem, I have no idea how to apply the colormap to the plotted data.
Is there possibly a way to extract the RGB values between 0 - 256 to reflect the plot colours? so I can just add an array of RGB values to the plot code, using the example here: https://uk.mathworks.com/help/matlab/ref/scatter.html under the subtitle "Fill the markers" (im referring to c = linspace(1,10,length(x));)
here is example code:
figure
sz = 25;
set(gcf,'Color','w') % set the background of figure to white
set1=rand(20,1)
set2=rand(20,1)*-4
set3=rand(20,1)*6
all_x_data(1:20)=1 %each set plotted at one x coordinate
scatter(all_x_data,set1,sz,'filled')
hold on
scatter(all_x_data+1,set2,sz,'filled')
scatter(all_x_data+2,set3,sz,'filled')
xlim([0, 4]) % change the axes limits
ylim([-6 6])
yline(0,'--k') % add a dot line at y=0
% open colormapeditor
% change the axis to -6 and 6
% change the colours at RBG 1;blue, 256;red and 127;white

채택된 답변

Walter Roberson
Walter Roberson 2023년 11월 8일
You indicated that you wanted the values "around" 0 to be white. In the following code, the values between -1/2 and +1/2 are mapped to white.
However... white markers on a white background is barely visible, so it is hard to tell.
figure
sz = 25;
set(gcf,'Color','w') % set the background of figure to white
set1=rand(20,1);
set2=rand(20,1)*-4;
set3=rand(20,1)*6;
all_x_data(1:20)=1; %each set plotted at one x coordinate
cmap = zeros(25, 3);
cmap(1:12,:) = repmat([0 0 .9], 12, 1); %blue
cmap(13,:) = [.9 .9 .9]; %white
cmap(14:25,:) = repmat([0.9 0 0], 12, 1); %red
disp(cmap)
0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0.9000 0.9000 0.9000 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0 0.9000 0 0
scatter(all_x_data,set1,sz,set1,'filled')
hold on
scatter(all_x_data+1,set2,sz,set2, 'filled')
scatter(all_x_data+2,set3,sz,set3, 'filled')
xlim([0, 4]) % change the axes limits
ylim([-6 6])
yline(0,'--k') % add a dot line at y=0
caxis([-6 6]);
colormap(cmap);
  댓글 수: 2
Walter Roberson
Walter Roberson 2023년 11월 8일
figure
sz = 25;
set(gcf,'Color','w') % set the background of figure to white
set1=rand(20,1);
set2=rand(20,1)*-4;
set3=rand(20,1)*6;
all_x_data(1:20)=1; %each set plotted at one x coordinate
ramp = linspace(0.1, .9, 12);
cmap = zeros(25, 3);
cmap(1:12,1) = ramp;
cmap(1:12,2) = ramp;
cmap(1:12,3) = 0.9; %blue
cmap(13,:) = [.9 .9 .9]; %white
cmap(14:25,1) = 0.9; %red
cmap(14:25,2) = fliplr(ramp);
cmap(14:25,3) = fliplr(ramp);
disp(cmap)
0.1000 0.1000 0.9000 0.1727 0.1727 0.9000 0.2455 0.2455 0.9000 0.3182 0.3182 0.9000 0.3909 0.3909 0.9000 0.4636 0.4636 0.9000 0.5364 0.5364 0.9000 0.6091 0.6091 0.9000 0.6818 0.6818 0.9000 0.7545 0.7545 0.9000 0.8273 0.8273 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.8273 0.8273 0.9000 0.7545 0.7545 0.9000 0.6818 0.6818 0.9000 0.6091 0.6091 0.9000 0.5364 0.5364 0.9000 0.4636 0.4636 0.9000 0.3909 0.3909 0.9000 0.3182 0.3182 0.9000 0.2455 0.2455 0.9000 0.1727 0.1727 0.9000 0.1000 0.1000
scatter(all_x_data,set1,sz,set1,'filled')
hold on
scatter(all_x_data+1,set2,sz,set2, 'filled')
scatter(all_x_data+2,set3,sz,set3, 'filled')
xlim([0, 4]) % change the axes limits
ylim([-6 6])
yline(0,'--k') % add a dot line at y=0
caxis([-6 6]);
colormap(cmap);
colorbar()
Vyte Jan
Vyte Jan 2023년 11월 8일
Thank you for your reply.
Your second suggestion was a lot closer to the vision I had for this figure.
Please see below the figure using my actual data that I was able to create using your suggestion, looks awesoome!
I changed the linspace from 12 to 125 to emphasize the colour change. I should have specified the purpose of me using the colourbar instead of a single colour (ie blue/red), was to get a gradient representation for the plotted data. I will also be using the same gradient effect on a brain map to emphasize spatial information in 3D space.
Thank you very much for your help on this.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Sulaymon Eshkabilov
Sulaymon Eshkabilov 2023년 11월 8일
As understood your question, this is what you are trying to get:
figure
set(gcf,'Color','w') % set the background of figure to white
set1=randn(20,1);
set2=randn(20,1)*-4;
set3=randn(20,1)*6;
all_x_data(1:20)=1; %each set plotted at one x coordinate
C = linspace(1,6,20); % Color space
scatter(all_x_data, sort(set1),[],C,'filled')
hold on
scatter(all_x_data+1,sort(set2),[],C,'filled')
scatter(all_x_data+2,sort(set3),[],C,'filled')
xlim([0, 4]) % change the axes limits
ylim([-6 6])
yline(0,'--k') % add a dot line at y=0
colorbar
colororder('reef')
  댓글 수: 1
Walter Roberson
Walter Roberson 2023년 11월 8일
The user wants all negative to be blue, all positive to be red, and "near zero" to be white.
It is not immediately clear if the user wants "more negative to be darker blue"

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Colormaps에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by