MATLAB Answers

Using data cursor with pcolor

86 ビュー (過去 30 日間)
Mark Brandon
Mark Brandon 2020 年 1 月 13 日
コメント済み: Adam Danz 2020 年 6 月 15 日
If one uses the data cursor on a pcolor plot, you will see three coordinates, X, Y, and Z, but the Z coordinate is always zero. It took me some time to realize that pcolor is simply a variant of the surface function, with the view fixed from above (normal to the xy plane). Inspection of the data associated with the pcolor handle will show that the "Z" values are actually stored in the CData array, and the ZData array is otherwise set to zero. This is a clever arrangement in that plot is fixed at Z = 0, and the Z values are otherwise rendered as scaled colors. The downside is that this arrangement cripples the datacursor (i.e. the Z value is not correctly reported).
One solution is to set ZData = CData (see Figure 2 produced by the code below). The datacursor will now show local Z values. The downside is that pcolor surface is now fully 3D. As a consequence, other plot elements (contours, points, lines) may be masked by this 3D surface. You can see the 3D "pcolor" surface in figure 2 by rotating the plot or by running the command "view(3)" in the command window.
The simpliest "fix" would be to add "C" values to the datacursor. (Perhaps I should suggest this as a new feature.) You will find that if you click on the contour lines, that the datacursor reports back with a variable "Level", so this kind of fix is possible. Or I could write a custom modifcation to the datacursor.
My hope is that someone out there may have found a simplier fix.
Best,
Mark
% Create data
[X,Y] = meshgrid(-2:0.2:2,-2:0.2:2);
Z = X.*exp(-X.^2 - Y.^2);
% Pcolor plot without modification. Datacursor will show Z = 0. Superimposed contours work okay.
figure(1)
hold on
hP = pcolor(X,Y,Z); shading interp;
contour(X,Y,Z, 'Color', 'k', 'LineWidth', 1);
datacursormode on
% PColor plot with modification (ZData = CData), Z value in data cursor works, but contours are locally masked.
figure(2)
hold on
hP = pcolor(X,Y,Z); shading interp;
hP.ZData = hP.CData;
contour(X,Y,Z, 'Color', 'k', 'LineWidth', 1);
datacursormode on

  1 件のコメント

Adam Danz
Adam Danz 2020 年 1 月 14 日
+1; This problem is driving me crazy!
None of the follow attempts work and they all throw an error in r2019b.
Update: As of r2020a, some of the method below are now functional.
Base code
% Create data
[X,Y] = meshgrid(-2:0.2:2,-2:0.2:2);
Z = X.*exp(-X.^2 - Y.^2);
figure(1)
hold on
hP = pcolor(X,Y,Z); shading interp;
dt = datatip(hP,0,0);
Add row, use 'CData'
row = dataTipTextRow('C','CData');
hP.DataTipTemplate.DataTipRows(end+1) = row;
% Error using matlab.graphics.datatip.DataTipTemplate/set.DataTipRows
% Value must be a string scalar or a character vector with the name
% of a data property, such as 'XData', or it must be a vector or a function handle.
Add row, use hP.CData
row = dataTipTextRow('C',hP.CData);
hP.DataTipTemplate.DataTipRows(end+1) = row;
% Error using matlab.graphics.datatip.DataTipTemplate/set.DataTipRows
% Value must be compatible with the data source.
Replace Z-row with 'CData'
hP.DataTipTemplate.DataTipRows(3).Label = 'C';
hP.DataTipTemplate.DataTipRows(3).Value = 'CData';
% Error using matlab.graphics.datatip.DataTipTemplate/set.DataTipRows
% Value must be a string scalar or a character vector with the name
% of a data property, such as 'XData', or it must be a vector or a function handle.
Replace z-row with hp.CData
hP.DataTipTemplate.DataTipRows(3).Label = 'C';
hP.DataTipTemplate.DataTipRows(3).Value = hP.CData;
% Error using matlab.graphics.datatip.DataTipTemplate/set.DataTipRows
% Value must be compatible with the data source.

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

回答 (1 件)

Dani
Dani 2020 年 6 月 15 日
% Create data
[X,Y] = meshgrid(-2:0.2:2,-2:0.2:2);
Z = X.*exp(-X.^2 - Y.^2);
% Plot
figure
hP = surf(X,Y,0*Z,Z); % surf instead of pcolor, Z is 0 -> no visibility problems for other objects
shading interp;
view(2) % force 2d view
hP.DataTipTemplate.DataTipRows(3).Value = hP.CData; % Overwrite default datatip value

  1 件のコメント

Adam Danz
Adam Danz 2020 年 6 月 15 日
This is my 4th solution "Replace z-row with hp.CData" listed in the comments section under the question. It now works as for r2020a but did not work in r2019b.

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

Community Treasure Hunt

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

Start Hunting!

Translated by