So I'm having issues correctly displaying a legend for my figure.
I have an image I'm displaying with ground truths marked in red and text labeled 1-11. Then, I'm wanting to have a legend that displays 1 through 11 vertically with the type of ground truth to the right of it. Unfortunately, I'm getting far, far from this. I would post a screenshot, but I'm technically not allowed to which makes troubleshooting a bit cumbersome.
h1=figure(1);imagesc(abs(image));set(gca,'YDir','normal');
hold on
plot(gnd_TruthY_test,gnd_TruthX_test,'r*');
text(gnd_TruthY_test,gnd_TruthX_test,num2str(c'),'Color', [0.859375000000000,0.859375000000000,0.859375000000000],'VerticalAlignment','bottom', ...
'HorizontalAlignment','right')
legend(gt{1,5}(c))
where gt{1,5} contains strings for the ground truth types and c are the indexes that corrspond to the groundtruths in the displayed image.
When I run the above code, my image displays properly but my legend only displays the first ground truth. If I repeatedly click run then the legend eventually builds up. I'm not sure I understand the legend() use in MATLAB >.<

6 Kommentare

dpb
dpb am 23 Apr. 2014
What's the dimension of gnd_TruthY_test? Do you have 11 line handles in the figure for the legend text to correlate with? The "builds up w/ RUN" makes me think not at the time of the call perhaps.
You can save the line handles from plot and use them as the optional first argument in legend to associate strings with given handle(s).
José-Luis
José-Luis am 23 Apr. 2014
Look at the output of gt{1,5}, it might not be what you imagine.
Darren
Darren am 23 Apr. 2014
The dimension of gnd_TruthY_test is an 11 column dimensional vector in this case.
Jose-Luis, are you referring to the output of gt{1,5}(c)?
dpb
dpb am 23 Apr. 2014
Bearbeitet: dpb am 23 Apr. 2014
Yes, he is...a
whos
and perhaps echoing it could help.
If it is a properly-formed array of 11 strings, legend surely should match 'em up w/ the handles of the lines, so one begins to presume there's something not quite up to snuff therein...
ADDENDUM:
Oh, just a thought--
To check if it's something to do w/ it being in (apparently?) a GUI, try
legend(num2str([1:11]','Line %d'))
in place and see if it doesn't work ok.
BTW, NB: what happens if write the above as
legend(num2str([1:11],'Line %d'))
wherein it's a row vector instead of column...
Darren
Darren am 23 Apr. 2014
legend(num2str([1:11]','Line %d'))
Worked properly, for the most part, but I still cannot adapt this version to mine.
legend(num2str([gt{1,5}(c)'],'Line %s'))
yields,
Undefined function 'real' for input arguments of type 'cell'.
I'm guessing this is now an issue of the fact that I'm trying to pull info from my cell? This is the part of MATLAB that is the most annoying to me...
Image Analyst
Image Analyst am 23 Apr. 2014
Don't call your image variable "image" because that is the name of a built-in function.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Kelly Kearney
Kelly Kearney am 23 Apr. 2014

0 Stimmen

If I understand your setup correctly, I think the problem is that you want your legend to reference the individual points of a single line object. Is this the sort of thing you're hoping for?
gnd_TruthY_test = rand(1,5);
gnd_TruthX_test = rand(1,5);
c = 1:5;
label = {'one','two','three','four','five'};
figure;
hl = plot([gnd_TruthY_test; nan(1,5)], [gnd_TruthX_test; nan(1,5)], 'r*');
ht = text(gnd_TruthY_test, gnd_TruthX_test, num2str(c'));
legend(hl, label);
If so, the trick is to plot each point to its own line object, which can be accomplished by adding the NaN-padding to each column (causing plot to treat each column as a different line; by default it ignores this convention if both x and y input are vectors).
If that's the case, note that this doesn't really link your legend labels to the text labels next to each point... but perhaps that info is already in your labels?

2 Kommentare

Darren
Darren am 23 Apr. 2014
Bearbeitet: Darren am 23 Apr. 2014
I implemented this via
h1=figure(1);imagesc(abs(IM));set(gca,'YDir','normal');
hold on
hl=plot([gnd_TruthY_test'; nan(1,length(c))'], [gnd_TruthX_test';nan(1,length(c))'],'r*');
ht=text(gnd_TruthY_test',gnd_TruthX_test',num2str(c'),'Color', [0.859375000000000,0.859375000000000,0.859375000000000],'VerticalAlignment','bottom', ...
'HorizontalAlignment','right')
legend(hl, gt{1,5}(c)');
But still receiving the same problem where only the first ground truth is displaying in the legend :/
Darren
Darren am 23 Apr. 2014
Nevermind, got it, had to remove the transpose on some of my input values! Thanks!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Gefragt:

am 23 Apr. 2014

Kommentiert:

am 23 Apr. 2014

Community Treasure Hunt

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

Start Hunting!

Translated by