add arrow above textbox

5 ビュー (過去 30 日間)
eb.az
eb.az 2024 年 10 月 10 日
コメント済み: Star Strider 2024 年 10 月 10 日
Hello
I creat a colorbar depnd on my data I want to add an arrow and anothe text above a text of this figure here my code put it not work with arrow can help me to fix it
% Create a new figure
figure;
dataValues = [ 0,0.1,0.2,0.3,0.35,0.4,0.45,0.6,0.65,0.7,0.75,0.8,0.85,0.95];%15
% Number of rectangles
numRectangles = length(dataValues);
% Different strings for each rectangle
labels = {'l','Above -5','-10 - -5','-15 - -10','-25 - -20','-30 - -25', '-35 - -30',...
'-40 - -35 ' , '-45 - -40 ', '-50 - -45','-55 - -50','-60 - -55','-65 - -60',...
'-70 - -65','Below -70 ','Below -70 '};
% Define the size of the rectangles
rectWidth = 0.3;
rectHeight = 0.3;
% Define the number of rectangles
x = 14;
% Define the starting position for the first rectangle
startX = 1;
startY = 1;
% Create a colormap
cmap = parula(numRectangles); % Generate a colormap with a number of colors
% Loop through each data value to plot rectangles
hold on; % Retain current plot
for i = 1:x;
% Calculate position for each rectangle
position = [1,1 + i * (rectWidth + 0.1), rectWidth, rectHeight]; % Stacked horizontally
% Get color based on data value
colorIndex = round(dataValues(i) * (numRectangles - 1)) + 1; % Scale to colormap index
rectangle('Position', position, 'FaceColor', cmap(colorIndex+1, :)); % Plot each rectangle
% Define text label from the labels array
labelString = labels {i + 1};
% Position for the text (next to the rectangle)
textX = position(1) + rectWidth + 0.1; % Right of the rectangle
textY = position(2) + rectHeight / 2; % Centered vertically
% Place the text label next to the rectangle
text(textX, textY, labelString, 'VerticalAlignment', 'middle', 'FontSize', 12);
end
hold off; % Release the plot hold
% Set the axes limits for better visibility
xlim([0 2]);
ylim([0 8.5]);
grid on
axis on; % Turn off the axes
% Add a title (optional)
%title('Matching Colors with Data Values');
% Add a text box above the rectangles
annotation('textbox', [0.7, 0.85, 0.000002, 0.000001], 'String', 'Depth', ...
'EdgeColor', 'none', 'FontSize', 12, 'HorizontalAlignment', 'right');
% Add an arrow annotation above the text
% Calculate the arrow's position
arrowX = [textX, textX]; % X positions for the arrow
arrowY = [textY + 0.1, textY + 0.2]; % Y positions for the arrow
% Create the arrow annotation
annotation('arrow', arrowX, arrowY, 'Color', 'k', 'LineWidth', 1);

採用された回答

Star Strider
Star Strider 2024 年 10 月 10 日
I wrote some simple functions to transform (x,y) coordinates to normalised values to use with annotation functions.
I added them as:
xapf = @(x,pos,xl) pos(3)*(x-min(xl))/diff(xl)+pos(1); % 'x' Annotation Position Function
yapf = @(y,pos,yl) pos(4)*(y-min(yl))/diff(yl)+pos(2); % 'y' Annotation Position Function
xl = xlim;
yl = ylim;
pos = gca().Position;
since they need that information as well.
They appear to work here, although you may want to experiment with slightly different values for ‘arrowX’ and ‘arrowY’.
Try this —
% Create a new figure
figure;
dataValues = [ 0,0.1,0.2,0.3,0.35,0.4,0.45,0.6,0.65,0.7,0.75,0.8,0.85,0.95];%15
% Number of rectangles
numRectangles = length(dataValues);
% Different strings for each rectangle
labels = {'l','Above -5','-10 - -5','-15 - -10','-25 - -20','-30 - -25', '-35 - -30',...
'-40 - -35 ' , '-45 - -40 ', '-50 - -45','-55 - -50','-60 - -55','-65 - -60',...
'-70 - -65','Below -70 ','Below -70 '};
% Define the size of the rectangles
rectWidth = 0.3;
rectHeight = 0.3;
% Define the number of rectangles
x = 14;
% Define the starting position for the first rectangle
startX = 1;
startY = 1;
% Create a colormap
cmap = parula(numRectangles); % Generate a colormap with a number of colors
% Loop through each data value to plot rectangles
hold on; % Retain current plot
for i = 1:x;
% Calculate position for each rectangle
position = [1,1 + i * (rectWidth + 0.1), rectWidth, rectHeight]; % Stacked horizontally
% Get color based on data value
colorIndex = round(dataValues(i) * (numRectangles - 1)) + 1; % Scale to colormap index
rectangle('Position', position, 'FaceColor', cmap(colorIndex+1, :)); % Plot each rectangle
% Define text label from the labels array
labelString = labels {i + 1};
% Position for the text (next to the rectangle)
textX = position(1) + rectWidth + 0.1; % Right of the rectangle
textY = position(2) + rectHeight / 2; % Centered vertically
% Place the text label next to the rectangle
text(textX, textY, labelString, 'VerticalAlignment', 'middle', 'FontSize', 12);
end
hold off; % Release the plot hold
% Set the axes limits for better visibility
xlim([0 2]);
ylim([0 8.5]);
grid on
axis on; % Turn off the axes
% Add a title (optional)
%title('Matching Colors with Data Values');
% Add a text box above the rectangles
annotation('textbox', [0.7, 0.85, 0.000002, 0.000001], 'String', 'Depth', ...
'EdgeColor', 'none', 'FontSize', 12, 'HorizontalAlignment', 'right');
% Add an arrow annotation above the text
% Calculate the arrow's position
arrowX = [textX, textX]; % X positions for the arrow
arrowY = [textY + 0.1, textY + 0.2]; % Y positions for the arrow
xapf = @(x,pos,xl) pos(3)*(x-min(xl))/diff(xl)+pos(1); % 'x' Annotation Position Function
yapf = @(y,pos,yl) pos(4)*(y-min(yl))/diff(yl)+pos(2); % 'y' Annotation Position Function
xl = xlim;
yl = ylim;
pos = gca().Position;
% Create the arrow annotation
annotation('arrow', xapf(arrowX,pos,xl), yapf(arrowY,pos,yl), 'Color', 'k', 'LineWidth', 1);
Use ‘xapf’ and ‘yapf’ in other instances as well, if you want to. Their use here should provide enough essential documentation for that.
.
  2 件のコメント
eb.az
eb.az 2024 年 10 月 10 日
thanx,it is work .
Star Strider
Star Strider 2024 年 10 月 10 日
As always, my pleasure!

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

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLabels and Annotations についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by