how to label lines on a graph

I have a program which asks for variable values of k. A function inputs these into an equation and displays a line on a graph for each value of k. How can i label each of these lines with the value of k used for each. The problem i am having is that the k values are variable and so are the amount of lines displayed on the graph, so i can't figure out how to do this for the values that are fed to the function. Any help would be much appreciated? Thanks, Scott

Antworten (10)

Maël Pouget
Maël Pouget am 10 Aug. 2021

10 Stimmen

I know the question is 10 years old, but
plot(curve,'DisplayName','Curve name for the legend')
% or
ax = axes();
hold(ax,'on');
for i = 1:10
plot(i*(1:10),'DisplayName',['Curve #' num2str(i)])
end
hold(ax,'off');
legend();
does the trick (for anyone who, like me, tumbles on this question while trying to name their lines within the plot() call.
Chad Greene
Chad Greene am 10 Aug. 2014

8 Stimmen

label might do the trick.

3 Kommentare

Calvin Burns
Calvin Burns am 2 Feb. 2021
Bearbeitet: Calvin Burns am 2 Feb. 2021
Get your sass out of here Mr. Chad
Basil Eldeeb
Basil Eldeeb am 11 Mär. 2021
lol
Carolyn
Carolyn am 27 Nov. 2022
Bruh

Melden Sie sich an, um zu kommentieren.

Michael
Michael am 1 Dez. 2011

6 Stimmen

The general method would be using the legend function, to which you give a vector of the plot object handles and a series of corresponding strings. For example,
figure; hold on
a1 = plot(x,y1); M1 = "Curve 1";
a2 = plot(x,y2); M2 = "Curve 2";
legend([a1,a2], [M1, M2]);
The legend makes the connection between the plot object a1 and the string M1, and uses this to generate the legend. All you must do in your loop is devise a way to generate ai and Mi for a general integer i. I don't have MATLAB open now to test it but I think there must be a way using a combination of sprintf/num2str:
sprintf('object%s',num2str(a));
Returns "object1" if a=1, "object2" if a=2, etc.,
Hope this helps, though not a complete answer. Mike

3 Kommentare

Not to nitpick, but the commas in the legend function should be semicolons, looking like this:
figure; hold on
a1 = plot(x,y1); M1 = "Curve 1";
a2 = plot(x,y2); M2 = "Curve 2";
legend([a1; a2], [M1; M2]);
This also will not work. The legend uses a vector of plots and a list of labels, and the double quotes should be single quotes:
figure; hold on
a1 = plot(x,y1); M1 = 'Curve 1';
a2 = plot(x,y2); M2 = 'Curve 2';
legend([a1;a2], M1, M2)
ananya mittal
ananya mittal am 3 Jun. 2020
Is there any way of naming around 100 curves in a plot ? This manual way can be very time taking.
Thanks in advance.

Melden Sie sich an, um zu kommentieren.

Matt Tearle
Matt Tearle am 1 Dez. 2011

4 Stimmen

How about overlaying text on the graph, next to the lines?
line(x,y) % or plot(x,y) with a hold on
text(max(x),max(y),num2str(k))
You could play with the (x,y) location of the text. When you say "line" do you mean a straight line or, in general, a curve? The former would make calculating placement very easy; the latter would require some more cleverness, unless max or min works for you.

3 Kommentare

Harold
Harold am 1 Dez. 2011
the lines are curves, and i am not fussed about the location of the text, it just has to be somewhere.
Matt Tearle
Matt Tearle am 1 Dez. 2011
Great, then what I have should do the job... unless the curves all converge at the ends or something :)
Madhuri
Madhuri am 17 Sep. 2017
What co ordinates should I specify when I want the text to be on the first point of the curve? text (x(1),y(1), labels) is not working

Melden Sie sich an, um zu kommentieren.

Igor Kubyshkin
Igor Kubyshkin am 26 Feb. 2019
Bearbeitet: DGM am 16 Jan. 2024

4 Stimmen

function text2line(h,ksi,z,T)
% Inserts text T in/near line with handle h
% ksi - relative distance from the beginning of curve,
% z - shift along normal to curve
%
set(gcf, 'CurrentObject', h)
x=h.XData;
y=h.YData;
i = round(ksi*numel(x));
% Get the local slope
dy=y(i+1)-y(i-1);
dx=x(i+1)-x(i-1);
d = dy/dx;
X = diff(get(gca, 'xlim'));
Y = diff(get(gca, 'ylim'));
p = pbaspect;
a = atan(d*p(2)*X/p(1)/Y)*180/pi;
% Display the text
switch z==0
case 1
text(x(i), y(i), T,'HorizontalAlignment','center', 'BackgroundColor', 'w', 'rotation', a);
case 0
ez=[dy,-dx]/norm([dy,-dx]); % unit normal vector
text(x(i)+z*ez(1), y(i)+z*ez(2), T, 'HorizontalAlignment','center', 'rotation', a);
end

7 Kommentare

Christopher Paolini
Christopher Paolini am 5 Jul. 2019
hydrothermal.pngIgor Kubyshkin's solution works great! Excellent!
Holden Tranquillo
Holden Tranquillo am 18 Mär. 2020
What does the call for this function look like? I am getting an errror
Error using matlab.ui.Figure/set
Error setting property 'CurrentObject' of class 'Figure':
The value set for this property must be a valid HG handle.
Error in text2line (line 6)
set(gcf,'CurrentObject', h)
Error in Tranquillo_4053_Project2_rev2 (line 164)
text2line('Solutions',3,3,str);
Holden Tranquillo
Holden Tranquillo am 18 Mär. 2020
I'm sending your function the handle for the plot command and it runs with no errors now but no text shows up on any of the lines
Holden Tranquillo
Holden Tranquillo am 18 Mär. 2020
Nevermind, I got it. Great function thanks! Cited you in my code
nlm
nlm am 30 Jul. 2020
@ Holden Tranquillo
How did you get this to work ?
Samim
Samim am 15 Jan. 2024
Bearbeitet: Samim am 15 Jan. 2024
what to input for the variable h in the function ?
DGM
DGM am 16 Jan. 2024
Bearbeitet: DGM am 16 Jan. 2024
Here's an example. Bear in mind that the offset parameter doesn't really work right unless dataaspect is unitiy.
% fake data
x = linspace(-5,5);
y = x.^3-12*x;
% plot the line
hp = plot(x,y); % get the handle for the line object
% add the label
str = 'banana'; % label text
ksi = 0.35; % normalized position along the curve
os = 0; % offset distance from the curve (doesn't work)
text2line(hp,ksi,os,str);
function text2line(h,ksi,z,T)
% Inserts text T in/near line with handle h
% ksi - relative distance from the beginning of curve,
% z - shift along normal to curve
%
set(gcf, 'CurrentObject', h)
x=h.XData;
y=h.YData;
i = round(ksi*numel(x));
i = min(max(i,2),numel(x)-1);
% Get the local slope
dy=y(i+1)-y(i-1);
dx=x(i+1)-x(i-1);
d = dy/dx;
X = diff(get(gca, 'xlim'));
Y = diff(get(gca, 'ylim'));
p = pbaspect;
a = atan(d*p(2)*X/p(1)/Y)*180/pi;
% Display the text
switch z==0
case 1
text(x(i), y(i), T,'HorizontalAlignment','center', 'BackgroundColor', 'w', 'rotation', a);
case 0
ez=[dy,-dx]/norm([dy,-dx]); % unit normal vector
text(x(i)+z*ez(1), y(i)+z*ez(2), T, 'HorizontalAlignment','center', 'rotation', a);
end
end

Melden Sie sich an, um zu kommentieren.

Nathaniel W
Nathaniel W am 8 Mai 2018

1 Stimme

Really late answer, but I was trying to do this same thing earlier. Here's a solution that works, and allows you to use if statments to add additional plots and labels:
t=1:1:10;
x=t;
val=true;
plots = plot(t,x,t,2*x);
names={'x=t','x=2t'};
hold on
if val
plots(end+1)=plot(t,x.*x);
names{end+1}='x=t^2';
end
legend(plots,names)
Credit to this answer for making legend text append work.
Emmanuel Adesina
Emmanuel Adesina am 24 Apr. 2021

0 Stimmen

@Matt Tearle Solution works fine, but puts all labels almost on same line...
line(x,y) % or plot(x,y) with a hold on
if max(y) > 0
text(max(x), max(y), num2str(k))
end
if max(dtm) < 0
text(max(x), min(y), num2str(k))
end
This checks if the plot is positive or negative and places the label accordingly
If you set both as min, it will place it at the origin of the line.
I hope there's a means to set it at the mid-point or other coordinates on the line.
piston_pim_offset
piston_pim_offset am 14 Nov. 2023

0 Stimmen

x = linspace(-5,5);
y = x.^3-12*x;
plot(x,y)
xt = [-2 2]; % Location the text will be
str = 'dy/dx = 0'; % text
text(xt,str)
Error using text
Inputs must be x, y, and optionally z coordinates followed by a character vector, cell array of character vectors, string array, or categorical array.

2 Kommentare

x = linspace(-5,5);
y = x.^3-12*x;
plot(x,y)
xt = [-2 2]; % Location the text will be
str = 'dy/dx = 0'; % text
text(xt(1),xt(2),str)
piston_pim_offset
piston_pim_offset am 14 Nov. 2023
thanks for correction

Melden Sie sich an, um zu kommentieren.

Igor Kubyshkin
Igor Kubyshkin am 27 Nov. 2024
Bearbeitet: Igor Kubyshkin am 27 Nov. 2024

0 Stimmen

Why plot command gives wrong result for complex number, when imaginary part is equal zero?
For example plot(0.5+0.*1i,'ro') depicts point in [1, 0.5] instead of [0.5, 0] .

1 Kommentar

That's not an answer to the question. In fact, it's not relevant to the question. This should have been asked as a new question.
I'm inclined to clean this up since it really doesn't belong here as an answer, but to answer your question:
Using the syntax plot(Y) will plot the columns of Y with respect to their row subscript, so the apparently complex scalar 0.5+0i is rendered as (1,0.5) -- because the real component is 0.5 and the row index is 1. That might already be something you are familiar with, but the problem here is that the apparently complex scalar that you created isn't actually a complex number.
p = 1 + 0*1i; % is this a complex number?
isreal(p) % no i guess not
ans = logical
1
Consider:
% these all plot fine, including the point with 0i
Z = [0.5+1*1i; 0.5+0.5*1i; 0.5+0*1i]; % this is a complex array
plot(Z,'ro','markersize',10,'linewidth',2); hold on
% this plots as if a scalar real against the index 1
p = 1 + 0*1i; % this is not a complex array
plot(p,'bx','markersize',10,'linewidth',2)
% if you're going to be plotting scalars, try to be explicit
plot(real(p),imag(p),'mo','markersize',10,'linewidth',2)
% or simply force p to be a complex scalar
plot(complex(p),'mx','markersize',10,'linewidth',2)
xlim([0 1.5])
ylim([0 1.5])
grid on

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Labels and Annotations finden Sie in Hilfe-Center und File Exchange

Gefragt:

am 1 Dez. 2011

Kommentiert:

DGM
am 27 Nov. 2024

Community Treasure Hunt

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

Start Hunting!

Translated by