function [hp, hn] = loglogpn(x,y, specpos, specneg, varargin)
%LOGLOGPN Log-log scale plot for positive and negative data.
% LOGLOGPN(...) is the same as LOGLOG(...), except that the Y data
% may have positive and negative values. This is useful to detect
% unexpected negative values in the Y data (causing repeated 'Negative
% data ignored' warnings), or to visualize the magnitude of an
% oscillating signal in log scale.
%
% LOGLOGPN(X,Y) plots X versus Y in log-log scale, where Y may have
% positive and negative values. By default, negative values are ploted
% with dashed lines and positive values with full lines. If X is not
% specified, Y is plotted versus its index.
%
% LOGLOGPN(X,Y,LineSpecPos,LineSpecNeg) specifies LineSpecPos and
% LineSpecNeg for the line types, marker symbols and colors for the
% positive and negative values of Y. For instance,
% LOGLOGPN(X,Y,'ro-','b*') plots the positive Y with red line and 'o'
% markers and the negative Y with blue stars '*'. If only LineSpecPos
% is specified, the same is taken for LineSpecNeg, with a different
% LineStyle.
%
% LOGLOGPN(X,Y,LineSpecPos,LineSpecNeg,'PropertyName',PropertyValue,...)
% sets property values for all lineseries graphics objects created by
% LOGLOGPN. See the line reference page for more information.
%
% [HP, HN] = LOGLOGPN(...) returns the handles to the two lineseries
% graphics objects.
%
% Examples:
% x = linspace(1,10,200);
% y = sin(x*2)./x;
% loglogpn(x,y,'r.','bo');
% axis([1 10 1e-2 1]);
%
% loglogpn(x,y,'b-','r:','LineWidth',2);
%
% [hp, hn] = loglogpn(x,y,'k');
% set(hp, 'LineWidth', 1);
% set(hn, 'LineWidth', 2);
%
% See also LOGLOG, SEMILOGY, SEMILOGYPN.
% F. Moisy, moisy_at_fast.u-psud.fr
% Revision: 1.01, Date: 2007/04/12
% This function is part of the EzyFit Toolbox
% History:
% 2007/04/10: v1.00, first version.
% 2007/04/12: v1.01, do not draw lines between ranges of Y
% separated by ranges of opposite sign.
% error(nargchk(1,inf,nargin));
if nargin<2
y=x;
x=1:length(y);
end
if nargin<3 % default LineSpecs:
specpos = 'b-';
specneg = 'b--';
elseif nargin<4 % LineSpec for Y<0 if the LineSpec for Y>0 is specified
if findstr(specpos,'--')
specneg=strrep(specpos,'--','-');
else
specneg=specpos;
specneg=strrep(specneg,'-.','');
specneg=strrep(specneg,':','');
specneg=strrep(specneg,'-','');
specneg=[specneg '--'];
end
end
indpos = find(y>0);
indneg = find(y<0);
ypos = y;
ypos(indneg) = 0;
yneg = y;
yneg(indpos) = 0;
if isempty(indneg) && ~isempty(indpos)
hp = loglog(x, ypos, specpos, varargin{:});
hn = [];
elseif ~isempty(indneg) && isempty(indpos)
hp = [];
hn = loglog(x, -yneg, specneg, varargin{:});
else
statehold = ishold; % figure was 'held on' before?
hp = loglog(x, ypos, specpos, varargin{:});
hold on
hn = loglog(x, -yneg, specneg, varargin{:});
if statehold==false
hold off
end
end
if ~nargout
clear hp hn
end