web-dev-qa-db-fra.com

Maximiser automatiquement une figure

Je crée des figures dans MATLAB et les enregistre automatiquement dans des fichiers. Le problème est 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 l'enregistrer dans un fichier.

Il me manque cette étape de maximiser automatiquement une figure.

Aucune suggestion? Jusqu'à présent, j'ai seulement trouvé 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.

36
Salvador Dali

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 MAXIMISER sur FileExchange qui utilise Java. C'est la vraie maximisation.

62
yuk

Pour une agrandissement réel (exactement comme si vous cliquiez sur le bouton Agrandir dans l’UI d’OS X et Windows), vous pouvez essayer ce qui suit, qui appelle un caché Java handle

figure;
pause(0.00001);
frame_h = get(handle(gcf),'JavaFrame');
set(frame_h,'Maximized',1);

La pause(n) est essentielle car ce qui précède s’étend hors de la matrice Matlab et se situe sur un thread distinct Java. Définissez n sur une valeur et vérifiez le plus l'ordinateur est rapide au moment de l'exécution, plus petit n peut être.

Une "documentation" complète peut être trouvée ici

22
The-Duck

à partir de R2018a , les objets figure ainsi que uifigure contiennent une propriété appelée WindowState. Ceci est réglé sur 'normal' _ par défaut, mais en le réglant sur 'maximized' donne le résultat souhaité.

En conclusion:

hFig.WindowState = 'maximized'; % Requires R2018a

Soit dit en passant, pour résoudre votre problème initial - si vous souhaitez exporter le contenu des figures en images sans vous inquiéter des résultats trop petits - je recommanderais vivement le export_fig utilitaire.

8
Dev-iL

Pour maximiser la figure, vous pouvez imiter la séquence de touches que vous utiliseriez réellement:

  1. ALT-SPACE (comme indiqué ici ) pour accéder au menu de la fenêtre; et alors
  2. X pour maximiser (cela peut varier dans votre système).

Pour envoyer les clés par programme, vous pouvez utiliser une procédure basée sur Java similaire à 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!

6
Luis Mendo

Comme proposé par un auteur ci-dessus , si vous souhaitez simuler un clic sur le bouton "Agrandir" des fenêtres, 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);
4
HomePlaneR

imho maximiser la fenêtre de figure n’est pas le meilleur moyen de sauvegarder une figure en tant qu’image en résolution supérieure.

Il existe des propriétés de figure pour impression et enregistrement . En utilisant ces propriétés, vous pouvez enregistrer des fichiers dans la résolution de votre choix. Pour enregistrer les fichiers, vous devez utiliser fonction d'impression , car vous pouvez définir une valeur dpi. Donc, premièrement, définissez les propriétés de figure suivantes:

set(FigureHandle, ...
    'PaperPositionMode', 'manual', ...
    'PaperUnits', 'inches', ...
    'PaperPosition', [0 0 Width Height])

et ensuite enregistrez le fichier (par exemple) en png avec 100 dpi ('-r100')

print(FigureHandle, Filename, '-dpng', '-r100');

Pour obtenir un fichier avec 2048x1536px ensemble Width = 2048/100 et Hauteur 1536/100, /100 parce que vous économisez avec 100 dpi. Si vous modifiez la valeur dpi, vous devez également modifier le diviseur à la même valeur.

Comme vous pouvez le constater, aucune fonction supplémentaire liée à l'échange de fichiers ou à la procédure basée sur Java n'est nécessaire. De plus, vous pouvez choisir la résolution souhaitée.

4
serial

vous pouvez essayer ceci:

screen_size = get(0, 'ScreenSize');
f1 = figure(1);
set(f1, 'Position', [0 0 screen_size(3) screen_size(4) ] );
2
ifryed
%% 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
1
braggPeaks

C'est la forme la plus courte

figure('Position',get(0,'ScreenSize'))
0
user48711