Exporting only the plot legend to a jpg file

83 ビュー (過去 30 日間)
Joe Lettieri
Joe Lettieri 2021 年 3 月 31 日
コメント済み: Xiangyan An 2023 年 12 月 19 日
I have an odd case where I want to export the legend (only) of a plot to a jpeg file. That is, I don't what the whole figure, or even the axes - just the legend. It seems that exportgrpahics cannot do that. Is there another way, or do I have to resort to a screen shot :(
I'm running MATLAB Version: 9.8.0.1323502 (R2020a)

採用された回答

Nikhil Sapre
Nikhil Sapre 2021 年 6 月 25 日
Hi Joe,
You can try something like this to turn of visibility of your plots, and axis object. This will export only the Legend from the figure.
clear all; close all;
figure;
p1 = plot([1:10], [1:10], '+-');
hold on;
p2 = plot([1:10], [1:10]+2, 'o--');
legend('text1', 'text2');
set(p1, 'visible', 'off');
set(p2, 'visible', 'off');
set(gca, 'visible', 'off');
exportgraphics(gcf,'test.jpg');
Thanks,
Nikhil.
  3 件のコメント
Heather
Heather 2022 年 11 月 15 日
編集済み: Heather 2022 年 11 月 15 日
@Nikhil Sapre, this looks like a great solution. One question: I'm finding that the legend text looks a bit grayed out. (Using Matlab 2020b.) Do you have any tips on how to avoid that? I've tried explicitly noting 'TextColor','k' in the legend options but that doesn't seem to help.
Aboltabol
Aboltabol 2023 年 7 月 3 日
Sapre's wayout is not really a solution. When you follow his example, you are turning off plots, one by one, and the according legends are grayed out in succession. Feature; not bug.

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

その他の回答 (2 件)

DGM
DGM 2023 年 7 月 3 日
I don't have exportgraphics(), so I'm not going to bother with that.
Consider the example:
% plot some fake data
yy = rand(20,3);
hp = plot(yy);
% put a legend on it
legstr = {sprintf('\\theta_{min} = %4.2f',rand()) ...
sprintf('\\theta_{min} = %4.2f',rand()) ...
sprintf('\\theta_{min} = %4.2f',rand())};
hl = legend(hp,legstr);
% get screenshot of figure as a raster image
drawnow
outframe = frame2im(getframe(gcf));
% crop the legend out of the image
hl.Units = 'pixels';
legpos = hl.Position;
legpos(2) = size(outframe,1)-legpos(2)-legpos(4)+2;
outframe = imcrop(outframe,legpos);
imshow(outframe,'border','tight') % show it
%% compare the results
imwrite(outframe,'out.jpg') % save the image
testjpg = imread('out.jpg'); % read the image back
S = dir('out.jpg'); S.bytes % get the file size in bytes
ans = 3480
imwrite(outframe,'out.png') % save the image
testpng = imread('out.png'); % read the image back
S = dir('out.png'); S.bytes % get the file size in bytes
ans = 1393
imshow([testjpg; testpng],'border','tight') % JPG is remarkably worse
So yes, you can save the legend alone as a JPG. You can also slam your hand in a car door. These are things you should actively avoid doing to yourself. Unless you're trying to work around compatibility issues with some other piece of crippled software that supports no image formats beyond JPG, there are often no good reasons to save your results as JPG. That goes especially for synthetic images like these with strong edges and flat regions of uniform color. That's even more important in MATLAB, where all JPG outputs are 4:2:0 chroma subsampled. In the given example, the saved JPG is littered with conspicuous artifacts and the apparent line colors are significantly altered. Not only is the image irreversibly damaged, this garbage-quality JPG file is more than twice the size of a clean, lossless PNG file. In this scenario, JPG offers no advantages to compensate for its faults.
Don't use JPG unless you understand and accept the amount of information you're throwing away and the amount of compression you're actually able to achieve with the given image content.

Xiangyan An
Xiangyan An 2023 年 12 月 19 日
I have just gotten a trick inspired by Sapre.
Instead of turing the axis and plots unvisible, we can set the axis sufficiently small or outside the figure or both. Then we can get a figure with the axis and plots unvisible, and the legend text is not grayed.
Following code are modified from that of Sapre acoording to this idea.
clear all; close all;
figure;
p1 = plot([1:10], [1:10], '+-');
hold on;
p2 = plot([1:10], [1:10]+2, 'o--');
lgd = legend('text1', 'text2');
lgd.Position(1:2) = [0.4, 0.6]; % any position at will
ax = gca;
ax.Position = [-0.1, -0.1, 0.01, 0.01];
p1.MarkerSize = 0.001;
p2.MarkerSize = 0.001;
exportgraphics(gcf,'test.jpg');
  2 件のコメント
DGM
DGM 2023 年 12 月 19 日
Sure, but again, why would you want to use a JPG?
When a PNG is cleaner and smaller?
That said, don't ask me why exportgraphics() can't even export the same thing twice consistently.
Xiangyan An
Xiangyan An 2023 年 12 月 19 日
I focus on the way to make the legend sole and this is what I want to show. One can save the figure as any format and through any function at will.

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

製品


リリース

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by