How do I add a marker at one specific point on a plot?

I have the following plot:
I annotated a red dot at the point I would like to mark. How can I add a marker at this point?

 Respuesta aceptada

Mischa Kim
Mischa Kim el 1 de Mzo. de 2024
Editada: MathWorks Support Team el 4 de Mzo. de 2024
You can add a marker in the following ways:
  • Plot the point itself: 
    hold on % to plot on the current figure
    plot(x_pos,y_pos,'r*') % adds a red asterisk at the point (x_pos,y_pos)
  • Specify a value for the 'MarkerIndices' property in plot to plot a line with markers at specific data points. For example, if 'x' is your x-axis data, 'y' is your y-axis data, and you would like to create a marker at the 10th (x,y) point:
    p = plot(x,y,'o-','MarkerFaceColor','red','MarkerEdgeColor','red','MarkerIndices',10)
  • Specify a 1-d array for the 'MarkerIndices' property to add multiple markers to the plotted line. For example, create markers at the first five points:
    p = plot(x,y,'o-','MarkerIndices', [1 2 3 4 5])
    p = plot(x,y,'o-','MarkerIndices', 1:5)
See the description of the 'MarkerIndices' property under the "Name-Value Arguments" section of the documentation page for "plot": 

8 comentarios

Thank you. it works now. but one question, can i use "set" function to mark a plot also?
Sure. First you will need to define the plot object, however. Something like this should work:
h = plot(NaN, NaN, 'r*'); %define the graphics object, but don't render anything.
set(h,'Xdata', x(10), 'YData', y(10)); %mark 10th point
pause(5); %after a few seconds...
set(h, 'XData', x(20), 'YData', y(20)); %mark 20th point instead.
Hi Mischa, I get error when I try to plot points with decimal points.
Could you expand on what you mean about plotting points with decimal points? For example are you trying to do
set(h, 'XData', x(20.3), 'YData', y(20.3)); %mark 20.3th point instead.
How would you set mltiple markers example shows marker at 10, what if i needed markers at 20 as well?
x = 0:0.1:pi;
y = sin(x);
p = plot(x,y,'o-','MarkerIndices',10)
x = 0:0.1:pi;
y = sin(x);
p = plot(x,y,'o-','MarkerIndices', [10 20])
But how can I remove this from a legend? We're clearly making a new line (or dot, in this case), and we don't want to have this in our legend?
legend(AutoUpdate="off") % is what you are searching
p = plot(x,y,'o-','MarkerIndices', [10 20])
with this code the marker is not in the legend.

Iniciar sesión para comentar.

Más respuestas (3)

Greg
Greg el 6 de Dic. de 2017
Editada: Greg el 6 de Dic. de 2017
With 7k views in a month, I'm surprised this hasn't been updated.
Starting in R2016b, there is a MarkerIndices property. Instead of the other answer's suggested:
plot(x,y);
hold on;
plot(x(10),y(10),'r*');
Now simply use:
h = plot(x,y,'MarkerIndices',10);
Move the marker(s) around at any time if you've stored the handle h:
h.MarkerIndices = 5:5:length(x);

1 comentario

In addition, you can specify the ‘o-‘ line style, which creates a solid line and markers. You can also specify marker properties, such as the face color and edge color.
x = linspace(0,pi,30);
y = sin(x);
p = plot(x,y,'o-','MarkerFaceColor','red','MarkerEdgeColor','red','MarkerIndices',10)

Iniciar sesión para comentar.

navi g
navi g el 9 de En. de 2017
hello, is this marking in plot is possible without writing code, and putting mark in plot in figure editor,
and for sinosoidal curve i have only x data, i dont have y data, but i need to mark on curve, means that i will give x value, based on x value it should place on curve exactly on sinosoidal curve,

1 comentario

For R2014b or later (I would have to check about earlier; I see some references in 2012 time frame) you can use data brushing. Click on the paintbrush in the figure and then you can click on a point to mark it.
For marking a particular location given only the x, then
x_to_mark = SomeSpecificXValue;
all_lines = findobj(gca, 'type', 'line');
number_of_marks = 0;
where_to_mark = [];
for K = 1 : length(all_lines)
this_line = all_lines(K);
this_xdata = get(this_line, 'XData');
if x_to_mark < min(this_xdata) | x_to_mark > max(this_xdata)
continue; %the line does not span that x
end
x_diff = diff(this_xdata);
if isempty(x_diff)
fprintf('skipping line #%d that is single point\n', K);
elseif all(x_diff > 0) | all(x_diff < 0)
%it is monotonic, safe to do interpolation
this_ydata = get(this_line, 'YData');
y_to_mark = interp1(this_xdata, this_ydata, x_to_mark);
number_of_marks = number_of_marks + 1;
where_to_mark(number_of_marks,:) = [x_to_mark, y_to_mark];
else
fprintf('skipping line #%d with unsorted x data\n', K);
end
end
if number_of_marks == 0
fprintf('That x was not found on a line we could handle\n');
else
hold on
plot(where_to_mark(:,1), where_to_mark(:,2), 'r*');
end
This is probably a lot longer than you were expecting. You did not happen to provide information that we might potentially have used to make it shorter. For example if you know there is only exactly one line, and that the x were sorted when you plotted, and that the x value to mark is definitely in range, then the code could be made much shorter.

Iniciar sesión para comentar.

Mourad
Mourad el 1 de Mzo. de 2024
Comment afficher le noms de barre des nœuds sur mon dessin matlab?

Categorías

Más información sobre Labels and Styling en Centro de ayuda y File Exchange.

Productos

Versión

R2016b

Preguntada:

el 27 de Feb. de 2014

Comentada:

el 14 de Nov. de 2024

Community Treasure Hunt

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

Start Hunting!

Translated by