Maximiser automatiquement une figure
je crée des chiffres dans MATLAB et les enregistre automatiquement dans des fichiers. Le problème que, par définition, les images sont petites. Un bon moyen de résoudre mon problème à la main est de créer une image (figure), de la maximiser et de la sauvegarder dans un fichier.
je manque cette étape de maximiser automatiquement une figure.
des suggestions? Jusqu'à présent je n'ai trouvé que ceci:
http://answers.yahoo.com/question/index?qid=20071127135551AAR5JYh
http://www.mathworks.com/matlabcentral/newsreader/view_thread/238699
mais aucun ne résout mon problème.
9 réponses
cela a fonctionné pour moi:
figure('units','normalized','outerposition',[0 0 1 1])
ou pour le chiffre actuel:
set(gcf,'units','normalized','outerposition',[0 0 1 1])
j'ai également utilisé la fonction MAXIMIZE sur L'échange de fichiers qui utilise java. C'est une véritable maximisation.
pour un Maximize réel (exactement comme cliquer le bouton maximize dans L'interface utilisateur de OS X et Windows) Vous pouvez essayer ce qui suit qui appelle une poignée Java cachée
figure;
pause(0.00001);
frame_h = get(handle(gcf),'JavaFrame');
set(frame_h,'Maximized',1);
le pause(n)
est essentiel car le texte ci-dessus sort du scape Matlab et est situé sur un fil Java séparé. Réglez n
à n'importe quelle valeur et vérifiez les résultats. Plus l'ordinateur est rapide au moment de l'exécution le plus petit n
peut être.
La "documentation" complète peut être trouvée ici
pour maximiser la figure, vous pouvez imiter la séquence de touches que vous utiliseriez réellement:
- ALT - espace (tel qu'indiqué ici ) pour accéder au menu Fenêtre; et puis
- X pour maximiser (cela peut varier selon votre système).
pour envoyer les clés par programmation, vous pouvez utiliser une procédure basée sur Java semblable à cette réponse , comme suit:
h = figure; %// create figure and get handle
plot(1:10); %// do stuff with your figure
figure(h) %// make it the current figure
robot = java.awt.Robot;
robot.keyPress(java.awt.event.KeyEvent.VK_ALT); %// send ALT
robot.keyPress(java.awt.event.KeyEvent.VK_SPACE); %// send SPACE
robot.keyRelease(java.awt.event.KeyEvent.VK_SPACE); %// release SPACE
robot.keyRelease(java.awt.event.KeyEvent.VK_ALT); %// release ALT
robot.keyPress(java.awt.event.KeyEvent.VK_X); %// send X
robot.keyRelease(java.awt.event.KeyEvent.VK_X); %// release X
Voilà! Fenêtre maximisée!
comme il est proposé par un auteur au-dessus de , si vous voulez simuler en cliquant sur le bouton "maximize" windows, vous pouvez utiliser le code qui suit. La différence avec la réponse mentionnée est que l'utilisation de "drawnow" au lieu de "pause" semble plus correcte.
figure;
% do your job here
drawnow;
set(get(handle(gcf),'JavaFrame'),'Maximized',1);
IMHO maximiser la fenêtre de figure n'est pas la meilleure façon de sauver une figure comme une image en haute résolution.
Il y a la figure de propriétés pour impression et l'enregistrement des . En utilisant ces propriétés, Vous pouvez enregistrer des fichiers dans n'importe quelle résolution que vous voulez. Pour sauvegarder les fichiers , vous devez utiliser la fonction d'impression , car vous pouvez définir une valeur dpi
. Ainsi, tout d'abord définir les propriétés de figure suivantes:
set(FigureHandle, ...
'PaperPositionMode', 'manual', ...
'PaperUnits', 'inches', ...
'PaperPosition', [0 0 Width Height])
et ensuite enregistrer le fichier (par exemple) en png avec 100dpi ( '-r100'
)
print(FigureHandle, Filename, '-dpng', '-r100');
pour obtenir un fichier avec 2048x1536px
mis Width = 2048/100
et hauteur 1536/100
, /100
parce que vous enregistrez avec 100dpi. Si vous changez la valeur dpi, vous devez aussi changer le diviseur à la même valeur.
comme vous pouvez le voir, il n'y a pas besoin de fonction supplémentaire d'échange de fichiers ou de procédure basée sur java. En outre, vous pouvez choisir n'importe quelle résolution souhaitée.
de R2018a , figure
ainsi que uifigure
objets contiennent une propriété appelée WindowState
. Il est réglé à 'normal'
par défaut, mais le paramètre 'maximized'
donne le résultat souhaité.
en conclusion:
hFig.WindowState = 'maximized'; % Requires R2018a
soit dit en passant, pour répondre à votre problème d'origine - si vous voulez exporter le contenu des figures aux images sans avoir à vous soucier des résultats étant trop petit - je voudrais je recommande fortement l'utilitaire export_fig
.
vous pouvez essayer ceci:
screen_size = get(0, 'ScreenSize');
f1 = figure(1);
set(f1, 'Position', [0 0 screen_size(3) screen_size(4) ] );
C'est la forme la plus courte
figure('Position',get(0,'ScreenSize'))
%% maximizeFigure
%
% Maximizes the current figure or creates a new figure. maximizeFigure() simply maximizes the
% current or a specific figure
% |h = maximizeFigure();| can be directly used instead of |h = figure();|
%
% *Examples*
%
% * |maximizeFigure(); % maximizes the current figure or creates a new figure|
% * |maximizeFigure('all'); % maximizes all opened figures|
% * |maximizeFigure(hf); % maximizes the figure with the handle hf|
% * |maximizeFigure('new', 'Name', 'My newly created figure', 'Color', [.3 .3 .3]);|
% * |hf = maximizeFigure(...); % returns the (i.e. new) figure handle as an output|
%
% *Acknowledgements*
%
% * Big thanks goes out to Yair Altman from http://www.undocumentedmatlab.com/
%
% *See Also*
%
% * |figure()|
% * |gcf()|
%
% *Authors*
%
% * Daniel Kellner, medPhoton GmbH, Salzburg, Austria, 2015-2017
%%
function varargout = maximizeFigure(varargin)
warning('off', 'MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame')
% Check input variables
if isempty(varargin)
hf = gcf; % use current figure
elseif strcmp(varargin{1}, 'new')
hf = figure(varargin{2:end});
elseif strcmp(varargin{1}, 'all')
hf = findobj('Type', 'figure');
elseif ~isa(varargin{1}, 'char') && ishandle(varargin{1}) &&...
strcmp(get(varargin{1}, 'Type'), 'figure')
hf = varargin{1};
else
error('maximizeFigure:InvalidHandle', 'Failed to find a valid figure handle!')
end
for cHandle = 1:length(hf)
% Skip invalid handles and plotbrowser handles
if ~ishandle(cHandle) || strcmp(get(hf, 'WindowStyle'), 'docked')
continue
end
% Carry the current resize property and set (temporarily) to 'on'
oldResizeStatus = get(hf(cHandle), 'Resize');
set(hf(cHandle), 'Resize', 'on');
% Usage of the undocumented 'JavaFrame' property as described at:
% http://undocumentedmatlab.com/blog/minimize-maximize-figure-window/
jFrame = get(handle(hf(cHandle)), 'JavaFrame');
% Due to an Event Dispatch thread, the pause is neccessary as described at:
% http://undocumentedmatlab.com/blog/matlab-and-the-event-dispatch-thread-edt/
pause(0.05)
% Don't maximize if the window is docked (e.g. for plottools)
if strcmp(get(cHandle, 'WindowStyle'), 'docked')
continue
end
% Don't maximize if the figure is already maximized
if jFrame.isMaximized
continue
end
% Unfortunately, if it is invisible, it can't be maximized with the java framework, because a
% null pointer exception is raised (java.lang.NullPointerException). Instead, we maximize it the
% straight way so that we do not end up in small sized plot exports.
if strcmp(get(hf, 'Visible'), 'off')
set(hf, 'Units', 'normalized', 'OuterPosition', [0 0 1 1])
continue
end
jFrame.setMaximized(true);
% If 'Resize' will be reactivated, MATLAB moves the figure slightly over the screen borders.
if strcmp(oldResizeStatus, 'off')
pause(0.05)
set(hf, 'Resize', oldResizeStatus)
end
end
if nargout
varargout{1} = hf;
end