This documentation page applies to an outdated major AMT version. We show it for archival purposes only.
Click here for the documentation menu and here to download the latest AMT (1.6.0).
function [out, cbar] = plot_reijniers2014(dirs, values, varargin)
%PLOT_REIJNIERS2014 - plot scatter plots out of data from reijniers2014
%
% Usage: colorbar = plot_reijniers2014(dirs, values);
% colorbar = plot_reijniers2014(dirs, values,'bias',bias);
% plot_reijniers2014(dirs, values);
% plot_reijniers2014(dirs, values,'bias',bias,'scatter');
%
% Input parameters:
% dirs : Normed source directions in cartesian coordinates
% values : Arbitrary values corresponding to direction in dirs (e.g.
% error or probability density)
% bias : optional, display arrows indicating the size and direction
% of local population response biases for different source
% positions
% target : optional, display the target given in Cartesian coordinates
% as a small cross
%
% Output parameters:
% c : Colorbar of the plot to modify outside of this function.
%
% Further, plot flags can be specified:
%
% 'interp' Plot scattered interoplated data (default).
%
% 'scatter' Plot only discrete scattered data instead of inter-
% polated scattered data.
%
% See also: exp_reijniers2014 reijniers2014
%
% References:
% R. Barumerli, P. Majdak, R. Baumgartner, J. Reijniers, M. Geronazzo,
% and F. Avanzini. Predicting directional sound-localization of human
% listeners in both horizontal and vertical dimensions. In Audio
% Engineering Society Convention 148. Audio Engineering Society, 2020.
%
% J. Reijniers, D. Vanderleist, C. Jin, C. S., and H. Peremans. An
% ideal-observer model of human sound localization. Biological
% Cybernetics, 108:169--181, 2014.
%
%
% Url: http://amtoolbox.sourceforge.net/amt-0.10.0/doc/plot/plot_reijniers2014.php
% Copyright (C) 2009-2020 Piotr Majdak and the AMT team.
% This file is part of Auditory Modeling Toolbox (AMT) version 0.10.0
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see <http://www.gnu.org/licenses/>.
% AUTHOR: Jonas Reijniers
% Modified and adapted for amtoolbox
% by Roberto Barumerli and Michael Sattler,
% Acoustics Research Institute, Vienna, Austria, 2019
%% ------ Check input options ---------------------------------------------
definput.flags.plot_type = {'interp','scatter'};
definput.flags.type = {'missingflag', 'fig2a','fig2b', ...
'fig3','fig4','fig5','fig6', 'fig7', 'fig3_barumerli2020aes'};
definput.keyvals.bias = [];
definput.keyvals.target = [];
[flags,kv] = ltfatarghelper({'bias','target'},definput,varargin);
% sphere radius [m]
rad = 1;
%% computing lambert projection considering front and back
[AZ,EL]=cart2sph(dirs(:,1),dirs(:,2),dirs(:,3));
% front
idxf=find(abs(AZ)<=pi/2);
[xf,yf] = polar_to_lambert(AZ(idxf), EL(idxf), rad);
% back indices
idxb=find(abs(AZ)>=pi/2);
AZpar=AZ-pi; % reverse on the frontal plane for plotting
[xb,yb] = polar_to_lambert(AZpar(idxb), EL(idxb), rad);
xb = -xb;
%% make gridlines
daz=30;
AZgrid=repmat((-90:90),length(-90:daz:90),1)'*pi/180;
ELgrid=repmat((-90:daz:90)',1,length(-90:90))'*pi/180;
[xgrid1,ygrid1,zgrid1]=sph2cart(AZgrid,ELgrid,1);
[xgrid2,ygrid2,zgrid2]=sph2cart(ELgrid,AZgrid,1);
[AZgrid1, ELgrid1] = cart2sph(xgrid1,zgrid1,ygrid1);
[AZgrid2, ELgrid2] = cart2sph(xgrid2,zgrid2,ygrid2);
[xvergrid,yvergrid] = polar_to_lambert(AZgrid1, ELgrid1, rad);
[xhorgrid,yhorgrid] = polar_to_lambert(AZgrid2, ELgrid2, rad);
% plotting
if flags.do_fig2a
fig = figure('NumberTitle', 'off', 'Name', 'Fig. 2 (a)');
elseif flags.do_fig2b
fig = figure('NumberTitle', 'off', 'Name', 'Fig. 2 (b)');
elseif flags.do_fig3
fig = figure('NumberTitle', 'off', 'Name', 'Fig. 3');
elseif flags.do_fig4
fig = figure('NumberTitle', 'off', 'Name', 'Fig. 4 (a)');
elseif flags.do_fig5
fig = figure('NumberTitle', 'off', 'Name', 'Fig. 5');
elseif flags.do_fig6
fig = figure('NumberTitle', 'off', 'Name', 'Fig. 6');
else
fig = figure;
end
hold on
% add data valuess
if flags.do_interp
[xg,yg] = meshgrid(-1:5e-3:1);
Vfq = griddata(xf,yf,values(idxf),xg,yg);
Vbq = griddata(xb,yb,values(idxb),xg,yg);
contourf(xg,yg,Vfq, 30, 'LineColor','none');
contourf(xg+2,yg,Vbq, 30, 'LineColor','none');
end
if flags.do_scatter
scatter(xf,yf,30,values(idxf),'filled','r');
scatter(xb+2,yb,30,values(idxb),'filled');
end
% plot grid
grid_color = 100 * [1 1 1] ./ 255;
plot(xvergrid,yvergrid, 'Color', grid_color);
plot(xhorgrid,yhorgrid, 'Color', grid_color);
plot(xvergrid+2,yvergrid, 'Color', grid_color);
plot(xhorgrid+2,yhorgrid, 'Color', grid_color);
text(-0.3, -1.35, 'FRONT', 'FontSize',13);
text(1.75, -1.35, 'BACK', 'FontSize',13);
set(gca,'XColor', 'none','YColor','none');
%%
if ~isempty(kv.bias)
% front indices
bias = kv.bias;
bias = bias + dirs;
[AZ,EL]=cart2sph(bias(:,1),bias(:,2),bias(:,3));
[xfb,yfb] = polar_to_lambert(AZ(idxf), EL(idxf), rad);
% back indices
AZpar=AZ-pi; % of pi/2)
[xbb,ybb] = polar_to_lambert(AZpar(idxb), EL(idxb), rad);
xbb = -xbb;
q1 = quiver(xf,yf,xfb-xf,yfb-yf);
q1.Color = 'black';
q1.MaxHeadSize = 0.05;
q2 = quiver(xb+2,yb,xbb-xb,ybb-yb);
q2.Color = 'black';
q2.MaxHeadSize = 0.05;
% q2.AutoScaleFactor = 1.5;
end
if ~isempty(kv.target)
% front indices
[AZ,EL]=cart2sph(kv.target(:,1),kv.target(:,2),kv.target(:,3));
idxf=find(abs(AZ)<=pi/2);
if ~isempty(idxf)
[xfb,yfb] = polar_to_lambert(AZ(idxf), EL(idxf), rad);
q1 = plot(xfb,yfb,'x');
q1.Color = 'blue';
end
% back indices
idxb=find(abs(AZ)>=pi/2);
if ~isempty(idxb)
AZpar=AZ-pi; % of pi/2)
[xbb,ybb] = polar_to_lambert(AZpar(idxb), EL(idxb), rad);
xbb = -xbb;
q2 = plot(xbb+2,ybb,'x');
q2.Color = 'blue';
end
end
axis([-1 3 -1 1])
pbaspect([2 1 1]);
colormap(flipud(hot));
c = colorbar;
box on;
if nargout == 1
out = fig;
elseif nargout == 2
out = fig;
cbar = c;
end
function [x,y] = polar_to_lambert(az, el, rad)
% convert polar coordinates to Lambert equal area projection
% equal area transformation
% for a reference see
% http://mathworld.wolfram.com/StereographicProjection.html
% and
% Formulas 22-4 (p173), 24-13 and 24-14 (p. 185-186) in
% Snyder, J. P. Map Projections - A Working Manual.
% U. S. Geological Survey Professional Paper 1395.
% Washington, DC: U. S. Government Printing Office, pp. 154-163, 1987.
az_0 = 0;
k = sqrt(2 ./ (eps + 1 + (cos(el) .* cos(az - az_0))));
x = k * rad .* cos(el) .* sin(az - az_0) ./ sqrt(2); % ./sqrt(2) normalizing
y = k * rad .* sin(el) ./ sqrt(2);