# how to label lines on a graph

조회 수: 1,294 (최근 30일)
Harold 2011년 12월 1일
편집: DGM 2024년 1월 16일
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
##### 댓글 수: 1이전 댓글 -1개 표시이전 댓글 -1개 숨기기
Zach Leo 2023년 8월 4일

댓글을 달려면 로그인하십시오.

### 답변 (9개)

Maël Pouget 2021년 8월 10일
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.
##### 댓글 수: 1이전 댓글 -1개 표시이전 댓글 -1개 숨기기
Paul Lebow 2023년 2월 1일
Perfect!

댓글을 달려면 로그인하십시오.

label might do the trick.
##### 댓글 수: 3이전 댓글 1개 표시이전 댓글 1개 숨기기
Basil Eldeeb 2021년 3월 11일
lol
Carolyn 2022년 11월 27일
Bruh

댓글을 달려면 로그인하십시오.

Michael 2011년 12월 1일
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이전 댓글 1개 표시이전 댓글 1개 숨기기
David Vargas 2016년 4월 23일
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 2020년 6월 3일
Is there any way of naming around 100 curves in a plot ? This manual way can be very time taking.

댓글을 달려면 로그인하십시오.

Matt Tearle 2011년 12월 1일
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이전 댓글 1개 표시이전 댓글 1개 숨기기
Matt Tearle 2011년 12월 1일
Great, then what I have should do the job... unless the curves all converge at the ends or something :)
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

댓글을 달려면 로그인하십시오.

Igor Kubyshkin 2019년 2월 26일
편집: DGM 2024년 1월 16일
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이전 댓글 5개 표시이전 댓글 5개 숨기기
Samim 2024년 1월 15일
편집: Samim 2024년 1월 15일
what to input for the variable h in the function ?
DGM 2024년 1월 16일
편집: DGM 2024년 1월 16일
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
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

댓글을 달려면 로그인하십시오.

Nathaniel W 2018년 5월 8일
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.
##### 댓글 수: 0이전 댓글 -2개 표시이전 댓글 -2개 숨기기

댓글을 달려면 로그인하십시오.

@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.
##### 댓글 수: 0이전 댓글 -2개 표시이전 댓글 -2개 숨기기

댓글을 달려면 로그인하십시오.

Sergio Yanez-Pagans 2021년 8월 21일
##### 댓글 수: 0이전 댓글 -2개 표시이전 댓글 -2개 숨기기

댓글을 달려면 로그인하십시오.

piston_pim_offset 2023년 11월 14일
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없음 표시없음 숨기기
Voss 2023년 11월 14일
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 2023년 11월 14일
thanks for correction

댓글을 달려면 로그인하십시오.

### 카테고리

Help CenterFile Exchange에서 Legend에 대해 자세히 알아보기

### Community Treasure Hunt

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

Start Hunting!

Translated by