How to set colormap for a 3D surface that is projected onto the XY Plane?

2 ビュー (過去 30 日間)
theblueeyeswhitedragon
theblueeyeswhitedragon 2018 年 8 月 17 日
コメント済み: jonas 2018 年 8 月 21 日
Recently, I asked a question on improving the performance of plotting functions like barh. The solution is very time efficient (about 150 times faster than barh), but I find it difficult to set the colormap for the surface https://www.mathworks.com/matlabcentral/answers/414253-why-do-plotting-functions-like-bar-or-barh-take-a-long-time-to-execute.
The code provided in the answer creates a 3D surface and projects it onto XY Plane to create the stacked bar graph.This projection has the correct length for every patch, but the color order changes from what I define. The graph has around 100 patches in the XY projection and I use only two colors based on a certain criteria defined by the identf vector. The resulting figure patches don't have the same color ordering as what I defined in the col matrix. I suspect this has to do with the fact that the graph is being projected onto the XY Plane. Note: colormap was not defined in the following figures.
for icol = 1 : length(data)
if identf(icol) == 0
col(icol,1) = 0;
col(icol,2) = 0.7;
col(icol,3) = 0.7;
elseif identf(icol) == 1
col(icol,1) = 0.79;
col(icol,2) = 0.79;
col(icol,3) = 0.79;
end
end
colormap(parent, col);

採用された回答

jonas
jonas 2018 年 8 月 17 日
編集済み: jonas 2018 年 8 月 17 日
In the answer to the other question:
"You can use a different colormap and a different method for calculating the Z-values, if you need more distinct color differences."
To clarify:
  • Change the colormap to define the colors you want to apply. For two colors this is basically just cmap=[r1 g1 b1;r2 g2 b2]
  • Set the Z-value of your dataset to assign these colors to elements.
In the previous answer, the Z-value was selected randomly. From your attached figures, it appears they are still assigned randomly. You need to change this line of code and assign Z-values by your criteria.
In short: colormap sets the palette, but you paint the segments through the z-data
  2 件のコメント
theblueeyeswhitedragon
theblueeyeswhitedragon 2018 年 8 月 21 日
編集済み: theblueeyeswhitedragon 2018 年 8 月 21 日
How exactly does one paint the segments through the z-data? Say I have to distinguish between a process A and another process B. I have a vector of 1s and 0s which has a one-one matching with the X data vector that contains information about the duration of these processes. Do I set the Z-values to a constant M for all 1s indeces and to another constant N for all Os?
M,N are constants.
for i = 1 : length(X)
if identifier(i) == 0
Z(i) = M;
else
Z(i) = N;
end
jonas
jonas 2018 年 8 月 21 日
If you have a vector of 1's and 0's, just use that as Z-data.
Let's say you have durations X of two process A(0) and B(1). You want A to be red and B to be blue.
X=[5 10 5 10 10 10];
id=[0 1 0 0 1 1];
cmap=[1 0 0;0 0 1];
First, prepare data:
%%Prepare data
Z=[id id(end)]; %Add one extra point to draw last segment
Xs=[0 cumsum(X)];
Xs=[Xs;Xs];
Zs=[Z;Z];
Y=ones(size(Xs))
Ys=Y.*[0.5;1.5];
And plot:
%%Draw
surf(Xs,Ys,Zs)
colormap(cmap)
colorbar
axis([0 50 -10 10])
Voila! See how the Z-data determine the color of the segment. You don't necessarly need 1's and 0's, any pair of numbers work as identifiers.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangePurple についてさらに検索

製品


リリース

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by