MATLAB Answers

Is it possible to viewing the "figure" window on second display?

426 views (last 30 days)
Dmitriy Shaulskiy
Dmitriy Shaulskiy on 24 Sep 2011
Commented: Jonah Pearl on 5 Aug 2020 at 14:10
I have two displays connected to my PC. Is it possible to define which of to displays will be viewed "figure" window?

  0 Comments

Sign in to comment.

Accepted Answer

Jan
Jan on 25 Sep 2011
Edited: Jan on 6 Jun 2018
You could create a function, which open figures on the 2nd monitor if it is available, otherwise the 1st monitor is used:
% [EDITED, 2018-06-05, typos fixed]
function FigHandle = figure2(varargin)
MP = get(0, 'MonitorPositions');
if size(MP, 1) == 1 % Single monitor
FigH = figure(varargin{:});
else % Multiple monitors
% Catch creation of figure with disabled visibility:
indexVisible = find(strncmpi(varargin(1:2:end), 'Vis', 3));
if ~isempty(indexVisible)
paramVisible = varargin(indexVisible(end) + 1);
else
paramVisible = get(0, 'DefaultFigureVisible');
end
%
Shift = MP(2, 1:2);
FigH = figure(varargin{:}, 'Visible', 'off');
set(FigH, 'Units', 'pixels');
pos = get(FigH, 'Position');
set(FigH, 'Position', [pos(1:2) + Shift, pos(3:4)], ...
'Visible', paramVisible);
end
if nargout ~= 0
FigHandle = FigH;
end
Another tool to move a (visible) figure to another monitor - under Windows only: FEX: WindowAPI

  11 Comments

Show 8 older comments
Loïc Toraille
Loïc Toraille on 12 Jun 2020
The function input is the same as the usual figure function, except you replace 'figure' by 'figure2'.
Walter Roberson
Walter Roberson on 12 Jun 2020
Numeric figure handles not supported with parameter-value pairs.
That is a misleading error message.
figure() permits you to pass the handle of an existing figure as its only parameter. If the handle is numeric, then figure() either creates or raises the figure; if the handle is a figure object, then figure() raises the figure.
figure() also permits you to pass in name/value pairs. However, it only permits that if you did not pass in a handle.
FigH = figure(varargin{:}, 'Visible', 'off');
is an attempt to create (or activate) the figure designated by varargin{:}, but with visibility turned off. In current versions of MATLAB, that will not work if you passed in a figure handle, and you would have to use two steps.
The easiest work-around is not to pass in a figure handle (or figure number) to this figure2() code, and to instead just permit figure() to create whatever figure number it wanted.

Sign in to comment.

More Answers (3)

the cyclist
the cyclist on 24 Sep 2011
Yes, effectively. One way to do it is by defining the 'Position' property of the figure. If you create your figure, then type
>> get(gcf)
You will see the current properties of the figure, including the Position property. You can then set that position to be whatever you want, e.g.
>> set(gcf,'Position',[500 500 400 300])
The arrangement of your second display will determine where you need to "push" the figure to. For example, with my setup, I actually had to make the x-position (first value in the vector) a negative value to push it onto my second display.

  1 Comment

Jonatan Dias
Jonatan Dias on 25 Sep 2017
Hi.
Thank you very much for your answer.
Extremely easy!
Regards, Jonatan.

Sign in to comment.


Walter Roberson
Walter Roberson on 24 Sep 2011
Take your pick of answers:
  1. Yes, but you would not like the result; OR
  2. No, but you can make it work fairly well
The respective methods:
1. set(0,'DefaultFigurePosition', [x y w h])
where x, y, w, and h are fixed x and y coordinates and w and h are fixed width and height. You can work out the coordinates to use by examining
get(0,'MonitorPositions')
which is documented over here.
The reason you probably wouldn't like this is that all figures will appear at that exact position and size (on top of whatever was there before) unless the code overrides the position. And there are a bunch of things that are actually figures. Including all GUI elements and including all dialog boxes.
2. Instead of setting the default figure position for everything, either right when you create the figure or right afterwards, set its Position property to be where you want it (and the size you want) on the second monitor, having used the MonitorPositions root property to find the proper range.
Warning Either way, it is not possible to getframe() a figure that is on the second monitor. This may affect your ability to saveas() or print(). Some routines detect the situation and temporarily move the figure on to the main screen and move it back afterwards, but other routines just complain.

  5 Comments

Show 2 older comments
Walter Roberson
Walter Roberson on 25 Sep 2011
hgrc.m does not appear to be documented, except in this solution: http://www.mathworks.com/support/solutions/en/data/1-VD9YT/index.html?product=ML&solution=1-VD9YT
hgrc.m is going to set the default to be on the first monitor; the user can set the position to be on the second monitor instead.
However, since MATLAB uses "figures" for GUIs and dialog boxes as well as "plots", adjusting the default to be on the second monitor risks having most everything appear on the second monitor, not just "plots"
Daniel Shub
Daniel Shub on 25 Sep 2011
hgrc is called by matlabrc. You are correct that it doesn't appear documented. My figures, both in Linux and Windows appear on top of each other in the exact position and size. Most dialog boxes, and I cannot think of any that don't, take on a different size, and often a different position. Often they are located in about the center of the screen. My guess is if you change the default figure position to the second monitor some of the the dialog boxes would follow, but not all.
Walter Roberson
Walter Roberson on 25 Sep 2011
Unfortunately I cannot test dual monitors.
There is a private function used by the dialog boxes, something about "getnicedialogposition"; my access to my server is down again today so I cannot read the source at this time.

Sign in to comment.


thalia
thalia on 17 Sep 2019
Simplifying Adan's script...
close all
f=figure('Units','normalized')
%place it wherever you want in the 1st monitor
f
%check units
%retreive location info
pos1 = f.Position
close all
f=figure('Units','normalized')
%place it wherever you want in the 1st monitor
pos2 = f.Position
close all
%Evaluate the following code or add it in the startup.m for permanent settings
%in case you want to add it permanently, replace the pos1,2 with the values (hard-coded)
MP = get(0, 'MonitorPositions');
if size(MP, 1) == 1 % 1 monitor
set(0, 'defaultFigureUnits', 'normalized','defaultFigurePosition', pos1)
else %2nd monitor
set(0, 'defaultFigureUnits', 'normalized','defaultFigurePosition', pos2)
end

  0 Comments

Sign in to comment.