dynare/matlab/+occbin/graph.m

157 lines
6.1 KiB
Matlab

function graph(M_, options_, options_occbin_, oo_, var_list)
% function graph(M_, options_, options_occbin_, oo_, var_list)
%
% Inputs:
% - M_ [structure] Matlab's structure describing the model
% - options_ [structure] Matlab's structure containing the options
% - options_occbin_ [structure] Matlab's structure containing Occbin options
% - oo_ [structure] Matlab's structure containing the results
% - var_list [char] list of the variables to plot
% Copyright © 2021 Dynare Team
%
% This file is part of Dynare.
%
% Dynare 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.
%
% Dynare 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 Dynare. If not, see <https://www.gnu.org/licenses/>.
options_ = occbin.set_option(options_,options_occbin_,'graph.steady_state');
if ~exist([M_.dname '/graphs'],'dir')
mkdir(M_.dname,'graphs');
end
fidTeX=write_latex_header(M_,options_);
if isempty(var_list)
var_list = M_.endo_names(1:M_.orig_endo_nbr);
end
%get endogenous variables
[i_var, number_of_plots_to_draw_endo, index_uniques] = varlist_indices(var_list, M_.endo_names, 1);
var_list_plots=var_list(index_uniques);
var_list_TeX = M_.endo_names_tex(i_var);
data_to_plot(:,:,1)=oo_.occbin.simul.piecewise(:,i_var);
if isfield(oo_.occbin,'simul') && isfield(oo_.occbin.simul,'linear')
data_to_plot(:,:,2)=oo_.occbin.simul.linear(:,i_var);
legend_list = {'Piecewise Linear','Linear'};
else
legend_list = {'Piecewise Linear'};
end
nperiods=size(data_to_plot,1);
ndim=size(data_to_plot,3);
if ~options_.occbin.graph.steady_state
data_to_plot=data_to_plot-repmat(oo_.occbin.simul.ys(i_var)',nperiods,1,ndim);
end
%get exogenous variables
[i_var_exo, number_of_plots_to_draw_exo, index_uniques] = varlist_indices(var_list, M_.exo_names, 1);
var_list_plots=[var_list_plots; var_list(index_uniques)];
var_list_TeX = [var_list_TeX; M_.exo_names_tex(i_var_exo)];
if number_of_plots_to_draw_exo>0
exo_index=NaN(number_of_plots_to_draw_exo);
for ii=1:length(i_var_exo)
temp_index=find(oo_.occbin.simul.exo_pos==i_var_exo(ii));
if ~isempty(temp_index)
exo_index(ii)=temp_index;
else
error('%s was not part of the shocks for Occbin.', var_list{i_var_exo(ii)});
end
end
data_to_plot(:,end+1:end+number_of_plots_to_draw_exo,1)=[oo_.occbin.simul.shocks_sequence(:,exo_index); zeros(nperiods-size(oo_.occbin.simul.shocks_sequence,1),number_of_plots_to_draw_exo)];
data_to_plot(:,end+1:end+number_of_plots_to_draw_exo,2)=NaN;
end
[nbplt,nr,nc,lr,lc,nstar] = pltorg(number_of_plots_to_draw_endo+number_of_plots_to_draw_exo);
for fig = 1:nbplt
hh = dyn_figure(options_.nodisplay,'Name',['Occbin simulated paths, figure ' int2str(fig)]);
for plt = 1:nstar
if fig==nbplt && ~lr==0
subplot(lr,lc,plt);
else
subplot(nr,nc,plt);
end
h_zero=plot([1 nperiods],[0 0],'--k','linewidth',0.5);
hold on
h1=plot(1:nperiods,data_to_plot(:,(fig-1)*nstar+plt,1),'b-','linewidth',2);
if ndim==2 && (fig-1)*nstar+plt<=number_of_plots_to_draw_endo
h2=plot(1:nperiods,data_to_plot(:,(fig-1)*nstar+plt,2),'r--','linewidth',2); hold on
end
hold off
max_y = max(max(data_to_plot(:,(fig-1)*nstar+plt,:)));
min_y = min(min(data_to_plot(:,(fig-1)*nstar+plt,:)));
y_bottom = min_y - .01*abs(min_y);
y_top = max_y + 0.01*abs(max_y);
if y_bottom==y_top
y_top=y_bottom+1;
end
axis([1 nperiods y_bottom y_top])
remove_fractional_xticks
if plt==1
if ndim==2
legend([h1,h2],legend_list,'box','off')
else
legend([h1],legend_list,'box','off')
end
end
if options_.TeX
title(['$' var_list_TeX{(fig-1)*nstar+plt,:} '$'],'Interpreter','latex');
else
title(deblank(var_list_plots((fig-1)*nstar+plt,:)),'Interpreter','none');
end
if number_of_plots_to_draw_endo+number_of_plots_to_draw_exo==(fig-1)*nstar+plt
break
end
end
dyn_saveas(hh,[M_.dname, '/graphs/' M_.fname '_occbin_' int2str(fig)],options_.nodisplay,options_.graph_format);
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
fprintf(fidTeX,'\\begin{figure}[H]\n');
fprintf(fidTeX,'\\centering \n');
if fig==nbplt
fprintf(fidTeX,'\\includegraphics[width=%2.2f\\textwidth]{%s_occbin_%s}\n',options_.figures.textwidth*min(plt/nc,1),[M_.dname, '/graphs/' M_.fname],int2str(fig));
else
fprintf(fidTeX,'\\includegraphics[width=%2.2f\\textwidth]{%s_occbin_%s}\n',options_.figures.textwidth*min(plt/lc,1),[M_.dname, '/graphs/' M_.fname],int2str(fig));
end
fprintf(fidTeX,'\\caption{Simulated time paths over time. Blue solid line: taking occasionally binding constraint into account. Red dashed line: ignoring constraint.}\n');
fprintf(fidTeX,'\\label{Fig:occbin:%s}\n', int2str(fig));
fprintf(fidTeX,'\\end{figure}\n');
fprintf(fidTeX,' \n');
end
end
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
fprintf(fidTeX,' \n');
fprintf(fidTeX,'%% End Of TeX file. \n');
fclose(fidTeX);
end
function fidTeX=write_latex_header(M_,options_)
if options_.TeX && any(strcmp('eps',cellstr(options_.graph_format)))
fidTeX = fopen([M_.dname, '/graphs/' M_.fname '_occbin.tex'],'w');
fprintf(fidTeX,'%% TeX eps-loader file generated by occbin.make_chart.m (Dynare).\n');
fprintf(fidTeX,['%% ' datestr(now,0) '\n']);
fprintf(fidTeX,' \n');
else
fidTeX =[];
end