new - title figure matlab
Maximizar automáticamente una figura (9)
Estoy creando algunas figuras en MATLAB y las guardo automáticamente en archivos. El problema es que, por definición, las imágenes son pequeñas. Una buena forma de resolver mi problema a mano es crear una imagen (figura), maximizarla y guardarla en un archivo.
Me falta este paso de maximizar automáticamente una figura.
¿Alguna sugerencia? Hasta ahora solo encontré esto:
http://answers.yahoo.com/question/index?qid=20071127135551AAR5JYh
http://www.mathworks.com/matlabcentral/newsreader/view_thread/238699
pero ninguno está resolviendo mi problema.
Esta es la forma más corta
figure(''Position'',get(0,''ScreenSize''))
Esto funcionó para mí:
figure(''units'',''normalized'',''outerposition'',[0 0 1 1])
o para la figura actual:
set(gcf,''units'',''normalized'',''outerposition'',[0 0 1 1])
También utilicé la función MAXIMIZE en FileExchange que usa Java. Esta es la verdadera maximización.
La maximización de la ventana de figuras no es la mejor manera de guardar una figura como una imagen con mayor resolución.
Hay propiedades de figura para imprimir y guardar . Usando estas propiedades puedes guardar archivos en cualquier resolución que desees. Para guardar los archivos, debe usar la función de impresión , ya que puede establecer un valor de dpi
. Entonces, primero establezca las siguientes propiedades de figura:
set(FigureHandle, ...
''PaperPositionMode'', ''manual'', ...
''PaperUnits'', ''inches'', ...
''PaperPosition'', [0 0 Width Height])
y segundo, guarde el archivo (por ejemplo) como png con 100dpi ( ''-r100''
)
print(FigureHandle, Filename, ''-dpng'', ''-r100'');
Para obtener un archivo con 2048x1536px
configure Width = 2048/100
y Altura 1536/100
, /100
porque lo guarda con 100dpi. Si cambia el valor de ppp, también debe cambiar el divisor al mismo valor.
Como puede ver, no hay necesidad de ninguna función adicional desde el intercambio de archivos o el procedimiento basado en Java. Además, puede elegir cualquier resolución deseada.
Para maximizar la figura, puede imitar la secuencia de teclas que realmente usaría:
- ALT - SPACE (como se indica here ) para acceder al menú de la ventana; y entonces
- X para maximizar (esto puede variar en su sistema).
Para enviar las claves mediante programación, puede utilizar un procedimiento basado en Java similar a esta respuesta , de la siguiente manera:
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à! Ventana maximizada!
Para un Maximize real (exactamente como hacer clic en el botón maximizar en la interfaz de usuario de OS X y Windows) Puede intentar lo siguiente que llama a un identificador Java oculto
figure;
pause(0.00001);
frame_h = get(handle(gcf),''JavaFrame'');
set(frame_h,''Maximized'',1);
La pause(n)
es esencial ya que lo anterior sale del Matlab scape y está situado en un subproceso Java separado. Establezca n
en cualquier valor y verifique los resultados. Cuanto más rápida sea la computadora en el momento de la ejecución, más pequeña puede ser n
.
La "documentación" completa se puede encontrar here
puedes probar esto:
screen_size = get(0, ''ScreenSize'');
f1 = figure(1);
set(f1, ''Position'', [0 0 screen_size(3) screen_size(4) ] );
A partir de R2018a , los objetos uifigure
y uifigure
contienen una propiedad llamada WindowState
. Esto se establece en ''normal''
de forma predeterminada, pero al establecerlo en ''maximized''
obtiene el resultado deseado.
En conclusión:
hFig.WindowState = ''maximized''; % Requires R2018a
Por cierto, para solucionar su problema original, si desea exportar el contenido de las figuras a las imágenes sin tener que preocuparse de que los resultados sean demasiado pequeños, recomiendo encarecidamente la utilidad export_fig
.
Tal como lo propone un autor anterior , si desea simular haciendo clic en el botón "maximizar" de Windows, puede usar el código siguiente. La diferencia con la respuesta mencionada es que usar "drawow" en lugar de "pausa" parece más correcto.
figure;
% do your job here
drawnow;
set(get(handle(gcf),''JavaFrame''),''Maximized'',1);
%% 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