Daniel@0: :- module(mlfigs, [ml_fig/6, ml_fig/5,ml_post/3, ml_opts/3]). Daniel@0: Daniel@0: %:- use_module(library(dcg_core)). Daniel@0: :- use_module(library(dcg_pair)). Daniel@0: :- use_module(library(computations),[unzip/3, (*)/4]). Daniel@0: :- use_module(library(mlserver)). Daniel@0: :- use_module(library(optutils)). Daniel@0: Daniel@0: % ------- tools for building matlab charts ------- Daniel@0: ml_fig(Type,XL,YL,Datasets,F) :- ml_fig(Type,XL,YL,Datasets,[],F). Daniel@0: ml_fig(Type,XL,YL,Datasets,Opts,fig(Code;xlabel(q(XL));ylabel(q(YL)),Opts1)) :- Daniel@0: unzip(Datasets,Names,Data), Daniel@0: maplist(term_to_atom*atom_string,Names,Labels), Daniel@0: compile(Type,Labels,Data,Opts,Opts1,Cmds,[]), Daniel@0: sequence(Cmds,Code). Daniel@0: Daniel@0: ml_post(Code,fig(Code0),fig(Code0;Code)). Daniel@0: ml_post(Code,fig(Code0,O),fig(Code0;Code,O)). Daniel@0: ml_opts(Opts,fig(Code),fig(Code,Opts)). Daniel@0: ml_opts(Opts,fig(Code,Opts0), fig(Code,Opts1)) :- Daniel@0: merge_options(Opts,Opts0,Opts1). Daniel@0: Daniel@0: Daniel@0: compile(T,Names,Data,Opts,Opts1) --> Daniel@0: plot(T,Data), Daniel@0: {option_default_select(legend(Pos),best,Opts,Opts1)}, Daniel@0: [box("off"), set(gca,"TickDir","out")], Daniel@0: ( {Pos=off} -> [] Daniel@0: ; [legend(cell(Names),"Location",q(Pos), Daniel@0: "LineWidth",0.25*get(gcf,"DefaultAxesLineWidth"))] Daniel@0: ). Daniel@0: Daniel@0: sequence([C],C) :- !. Daniel@0: sequence([C1|Cs],C1;Ss) :- sequence(Cs,Ss). Daniel@0: Daniel@0: pairs_to_cell(Pairs,{X,Y}) :- unzip(Pairs,X,Y). Daniel@0: Daniel@0: plot(bars,Data) --> plot(bars(grouped),Data). Daniel@0: plot(bars(Arr),Data) --> plot(multi((x,y,varargin)\\bar(x,y,q(Arr),"EdgeColor","none",cref(varargin,[':']))),Data). Daniel@0: plot(areas,Data) --> plot(multi(@area),Data). Daniel@0: plot(multi(Fn),Data) --> Daniel@0: {length(Data,L)}, Daniel@0: {maplist(pairs_to_cell,Data,Cells)}, Daniel@0: [multibar(Fn,cell(Cells)),caxis([1,L+1])]. Daniel@0: plot(scat(T,Ms),Points) --> Daniel@0: hold(run_left(foldl(scat(T,Ms),Points),0,N)), Daniel@0: [caxis([1,N+1])]. Daniel@0: plot(lines,Points) --> Daniel@0: {length(Points,N)}, Daniel@0: hold(run_left(foldl(line(N),Points),0,_)). Daniel@0: Daniel@0: scat(o,Ms,Points) --> Daniel@0: \< (succ, dcg_core:get(N)), Daniel@0: {unzip(Points,X,Y), length(Points,L), nth1(N,Ms,M)}, Daniel@0: \> [scatter(X,Y,get(gcf,"DefaultLineMarkerSize").^2,repmat(N,L,1),M)]. Daniel@0: scat(f,Ms,Points) --> Daniel@0: \< (succ, dcg_core:get(N)), Daniel@0: {unzip(Points,X,Y), length(Points,L), nth1(N,Ms,M)}, Daniel@0: \> [scatter(X,Y,get(gcf,"DefaultLineMarkerSize").^2,repmat(N,L,1),M,"filled")]. Daniel@0: Daniel@0: scat(p,Ms,Points) --> Daniel@0: \< (succ, dcg_core:get(N)), {marker(N,M)}, Daniel@0: {unzip(Points,X,Y)}, Daniel@0: {nth1(N,Ms,M)}, Daniel@0: \> [scat(arr([X,Y]),"marker",M)]. Daniel@0: Daniel@0: line(N,Xs-Ys) --> Daniel@0: \< (succ, dcg_core:get(I)), Daniel@0: \> [plot(Xs,Ys,"-","Color",row(get(gcf,"Colormap"),floor(I/N)))]. Daniel@0: Daniel@0: marker(N,M) :- Daniel@0: I is N mod 5, Daniel@0: nth0(I,["r.","g.","c.","b.","m."],M). Daniel@0: Daniel@0: hold(G) --> [newplot,hold("on")], phrase(G), [hold("off")].