From 7dd3c6b9256c867cd14a8da0e1ccc1852fa1790c Mon Sep 17 00:00:00 2001 From: Martino Ferrari Date: Thu, 27 Oct 2016 11:07:23 +0200 Subject: [PATCH 1/2] Added close method cleared up the save In this ways is possible to plot and save multiple figures --- examples/basic.png | Bin 23897 -> 27032 bytes matplotlibcpp.h | 25 +++++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/examples/basic.png b/examples/basic.png index eef82a22f12ee18ddabaf32fae68b57cd89a061e..0a7862091e5073eb0b765841100bc384c830c119 100644 GIT binary patch literal 27032 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

j?W+fJOKB@`$Yf=Y@+HD>@h(X*>}?27YZhCGy> zmYInH8(m*<>-$rpV?_awki;i^35$ht_&K3u%>7EJC3Pq@>jM~fyuT=9ha#*)$RB?Y z-C+f&xWvWIpg&s=r^w_I0G;Ffok>Hb1&`)>M1+NfH-`Xonh4GP_6>Fi0Hv0gmX-#H zxd5C~CBS}xQ*y()A!zJkiRKC;Ae7FtaB{vDrv#NXM7WSzy1Jc;m4ME6sIcgV5=W0% zmZ`v^)zrIQQ$!Y|7y9wG4Z#YrFa{84cacdU&>}T(zks(SwrBVN&JAEi&IrgWvnU3b zoVJ#5z8BQ69SLpQusgpn4*vrl#w_!Jd{?0(Le$ zdi9TC!ZN^C-yszCT{j@@Nka{3zzhs6eJ}E;?B;}9-MUGLOd}MNiWK&z=0<4GNO!tI z=`AvlxD&1f)G1ZP5LA<yRjg6<%zS-L z3iJsVD0M5~oxbH6W(L?Q`z-MQBnXhaQ3|cr*49ky?8$f+*L5Wmt*L*%K5+A&NIDR| z!=QtEDFGbYFh}P!Qc2O))<*HR0U43!uU=)>5(Wg;N#HK?LBbpYr5CmMKntN|po4dh zUvYLD`4(u~@2ji+4|Imqy|0afgEA8jfp#yHy#x(-5c!TZUVBQRVM$r# z;BQ^!P6@hJJ+rg5#q7h48GYOzs4Hbz<$exWbzx98%eJ+S+{>;Ko20r zMgZPP1pV=;-T0Ri#oEW?BO{L=O_+Mw^u|}so@gWi8Sk*S_hvw=c9Lkyu9u|E_3Kn% zMIyikM6+L_YV546vi7eg5LgM;NY^9g;gyZwQ9$eS*4EY0Da<@>Xlj_T+zCtLU#`Ai7lLAg_qbS1M}~Gle80Ti?_6FDKX)Vi*7DEhAwUjpRNnSyO9$-n z4}d7C*xA{+GCaJ0U&zD5gOQs%1~5!cZf7b#F3i^B=WBELelUx6!gTK$@ne6!r4-m_ z99#+c*3}*~h|EEsfS!LCoo^(t=_KQ7|Itz0&24eikOs!XYeoOc##Kz(Lcwn8T}Zr) z1ZrgTS!HfO6khdR;n#b8HDqn=5p?Yj0M&u#V@JN+X1T|Gurn@7+BMsh?woH~{JwaT zUBtA6p2FGfe7XCN>&W2=6MacIMgN}wPmGL;>irMFl{Yr3aLPZX2fm_j3^)X5z|nv@ zqEud~bbyS)4(K5$dqIQ`e6CkBzd;D9U_jpk0zY5^ppxSXE-bKV1**%>&p#=W{D;BZYij6`xqrix0gu}$MQgO7w- zSVl9RjONim5kG#0`%7D!0c4~b!@&#v>?zfglaqNM01+7(nF@f{TH-eKrE6Y^nkV>+ zLRAlp*#giJxvouRaPkTu%Rj8-kn3-!)Nk9XGyNd6)jGgxXTfOf19Q~}xInDYfmQGU zus+)rO|YA#U!78op^hIcjw3*&ePbAaf>>Q$oe%0Mlsz>5HA6j?yTHCZ0U_c0#zcgN zi?Fe=RepR~)f=e7xol&Nb&@* z)4bROQUVGTX6EVzpFO$48~x&iF*i4Nf$!=xaL82=^d<50=Nn<6p_9A&|2v5zr*^<3 zjv(6nfIeo7fL8k*je&&Nsi^Kf^1d#rbz@;9v9PcZaIuEqN&W?1116w-k5qdN`NCqy z6B@cc@VNWHyF@H!;O>U8)ZGpPr0nwaH2y`O*yl6mY7Jx?uNJazL4ZSi( z&LPkoIdY+}-|x$yEub6qkrPFTy}dVm{rwBUD?);o4~=$gk1pnKU^I4|U{&BnEzdA_1F;Hz5>NNf|pklqCN9&v2UnueM> z50JG|6TZ%FGw+ zc>nkN?DswPhxfz&u=lYa4|Qg)S=YK&obfw<=eZ_KO+}XIHsx&$3=AT9xmW5K7}y*b z7+B``xZujcegO-3x#jXwUK1bu@x?d)2Ye=YE2ry%fkAA7{)hQRvd9Jl<1vQ(s~4J{ z>6`N&o|+a5y?Z`mK2LH!EHLu(m|)7J%DuToc3*&yEIeeQzVdbxmoc=5+izev|4%FvtF)N=rkaw{r}pb}6g^_9(x}p~&6|~p>Gj^;9;Kjtaul`5Z?y!l z;(59Bt?6oMm-S({ zFM8;m61u0u6^q!KT=@}q^!;h{_f_W~Tkhn|H%C)OQ@^@H>uo34dU|@~V{IqPitQ@f zv?Iv5wJ(mhGFYg<-Ma*?1TAu<+T~+(H>a{hw9j?mh05&iH*?J{6V+yYU#sZl=V5Ld z=H~elSBDx-iD-2=rN$bNDbXm35_DQ9d$-)n%FkaneT76KZReWa#W-AFUzb2CGX)*z z{*?2gB`oVzQdI;A6;NPr+LtEUvV9!Bso@z%M6ZO7l&MyaK9#?rzGbS0R+n4qKh+{rF7?DJMq;h206KV0- znXG`e@cW&+GBPoF=PBv@4#J}y{XpUM43O|;_*<2 z3k!?@=CM;jZs_>}?=H2PuWu^@GJ?BZ?e*)A;JSbBIujEU8!PJ%DvPfVczAeP*Gcc} zc=dd{K=+4D{!#bqbNkcXU$=>fv>F}f`CZnO+OCcfl)`VbE833r>Kzc1$bB#cjMDo$ z{mBEXY|dg55{86i9Owt(-lhJ+oay;eXx=q$A>hU@l5B*b+OM`goZ+^=^1~F7 zCSX_Sb+9I)b{~AVgs?WjrN0(6~2)rDe?bxZ2wXH zPbOg7b^{}+gc6%P`TIk^f0q-m9siExWxIv86;c$4rgwRiLXMlR6uVVKRD$>PS_9Fy zs`cL1(=Jras`&QpRcPr8U3Q(WOfvqR$7t*0DQ9X*Uy8sc4|{O}KK^f6pZMnC46%Wc z5mnh}+M|9Hji{^KM2QwWUBqP=<%OCo*YNagnk>^@&gp+!{a0Cc@skEt>!-Z`k*;kZ;6b^dQUgH$k~x zy@FHg-fIfT#~LZLeGF9fxjtJ5k7ciSTD%U<%=-K}o6522#d2??hQGf*1tc`$uN@79 zC}l}Nw`S`#baaw|e2*7v6sh;6x1Oz~+5XH8`P$t*k^KU@?euploe&`)v+ zM{q}~m`4SWFU=-SAtA_6nov?!R+i;RCUoT_ibhNuJOqZSXbHEc10vGkIA21+XBq#C zHjm>T+Fmcc3pj^oxuVJ&ZGiy5wi*zwaAhG@adD{M#qk6XcB7SQVu{o2kHmBpo16CY zUh5gK%l!ecoh*?wVhz(fS5qC=jE#u$OmQDFN5VUI#(^1G-Px(U*ltlxNlAO5S% z7G-I_$0g$TzdWVyDAFiWxqbKUq|Z*0z!MGzjTQs3`I-Wr@=X;axil$sSV-f$$ zrka`>5;{7g-zZ!>JiD=cdE3SIHYVlNeC={Qo55tBf=S(7pW`irtZ_9yTDChMDF04l z*&61THJplzq7^Us{P`ZvEfUGYGQ&0)18EeW$lIkrAd{q&lzJOxgw!I=uVTa9c0{4- z>aiQ+#d+oWjU{fVNybUF>};9!(Hv>3nWvr)|Lxf%$b{Ab`Bnk=1oSLFeYzv_`ZZZ| z<6nDN|89e4s6TA#x|Kj|CUwMrP|MSV}-7FS*YZLtd2P}&NInVia6)r1+LF?5$z9vYMfnM*ntjX^Sj>TDe{(%WYKbvap+_N%_B); zER%^Kn{D-~b#`_Rw;vf8fG>5uPsqxu413620;CAt8G2prKYbmqgNl~C{_^DuOK+vl z$G^rk`fba6>>wrc$-GAvT1yf+^*6R#b|$M#x?Pb4Nwz@dy*G-B#%nAT<<(orSn5e7;-sUauWPATxqUs-48eP-IHlH;A#V=O|RXzxi^xk=!x`4IX2Pn z?M{pBvH9HXr@3zt0J9u!){d|}d6M%zH$EsR$a^_bC?2d6cs`q$Sj%qv*}=MEth%~- z|88YqO=q?b(AoHA96~Y@ggdZj8!oe+w-NJol@eLyWQTWzd|GCAfxr0hdfMS zVPPASeFa-+A$`imYN0eV+i9P#>2JzZ9quD_Vz^fg2s~8xhA8*dMEL2W_xv5WC z1knJW58C{1B6~O`HrhP{kOODz#P&35`x^nM_0m6m$|w)4zH`$9PxY>gJ0pLii1_N) zk(4&wABpzi}tV6;d@|Op&{7#TA5o7=aU5 z>0H_Lo)=q<6FJg&Xm1faUZ6P>`R` z!pPXO>;^`$G*?hq$R;3A|Gl9*lvqqt`Rt|fUeyt5N-=h}(aFf%r!R_zQQmHWSM z2`q-ZynH6-JupJ@^8C1dcI`4XXXhGe(gZqJf`cmHk>z6l4VlQf4LRh|0mYOZIxzLc z;RJy~%i@(voA=R}G_iQTbm-k;jnZENtwf)8%N?ULTzYj09ZmEE@g# z-{J889cxgIQS_HKu#edphG;t`*6i2BXC(PeqI8>YTCNZ%FWuRClO%YH2G_r4j|O1O zxy!jR>@KH@ECJ*6mfGSGi8YE)$U1RXOhrLVLc zBxEF&10-j$X354bG;ldMAX?;5R7>01_{&S|;mfAj z3UZ0{I@GoQb-`qhPWXYhr+v)wQ&jFtSG{d_YdwctDN78eSjVkHS zbCyN=5>nENmz(=WQ0Ftjuey$19Kv>8&PWM}7;(Z%erb((2H5<{GxmA$5B~1*vxgS% z1LOfY^Ho$_je6wD$XIw0Wra_h(wwqR!gOiif1CIY#8a*5D|R=bv=n#))`j%pgS?HP z32srj(c73tuh4OcHv6A_SB~}MsCC+@>U1+1u0EG=M|ON73ksG?==E)4-WR!#b<+LY zY+q@)Tm_gcA1=M)nj&~0g+%-N?7@}QbyD1aTnNYu#J3v}2m2!u2=!NLALxVW!|OFa z;Dwaxy{i8j_#zv_mk`V~@HX3GMx~iZU;I0IX$lbv#%m5T2ImoK(P0ZUcR49JlPVT` z3Y?_WHv)=twD(DJcC*zR@IJEhKhyN*n(W5ye~JzpC31~hds47^e?F9ra1`ra1|yeT zMxC`>D&E1r|Kff)VT4A;AJKJEw%glQ&jbSxx|jjeM(a+$^C2o-I5&?uYD4b$#y?Y7 z{n6v7OkwZIz&E>1wQiBO3GZl_tL4+be@aS0Qv79!MFv-v?Fs#hNOl3PIm6kJ;67Pg z88(K;9~{*%sAa*@Ws@);sBZiT%L~C=ZVbx%hG4Xpg!j*2`eQON#NVSWk<}JzR3sqj zxT3gE@~&5A6Qh$HO^vONg|$8uP4{csb?)tq(bzxcb4%HGIb#(S)_c?SCj9Q%;>eOU z<12sv$^yI5ecI-lTA|O=MuHL7@8h==v#Sb8>YwKhe zP_z^fM?eg$(|>pW*5WHE$5I?G+G*7`B4je9A0h9+aH!mk1oduc6#N_7U$bXqlhIt+|QV49?3KQ7}$ zKYK~}L~Z@tHfyP0pU(WM*tONxcWk@3=O-HP_htIvX)rzLA)E~uql8^H+cyO=F;ePp zi>bAB_e}Oa0peo`3p_iXor0NH;SOC#Tied5#A?ey#PddVYeubzFNL=ECp6hh67`tt zxI{jDfN1L&CrkU_V@UP9G{#(dSmRt<$7fdLPCKu=vR?5CI-5{k`s_3Hh`8a3SJ!n{ z3E3NEf*1ny%a&~&yK~Eux2%@LVj+Vo zQ}SAqXyTu;9PjEQSDAA5_mN znVc=z2D^)xt#iiZq_0vnVrCvOx;4OnDf}a+7Wst|z5W>+uIiEBDMNncFIkzt&42F$ zRJt{!6Kg4$W<{Pp}9B)oJ=g^EpEstWm$pXT7aU3Fu{2abn-=;t|rJVihNzmX^A^I!r`Wl&^eP z`HI3x0{i(V6F9G7V8gz2^1ARH9sJ6wKN_9s)TBAC#PKALd6z@B> zUhawv=`siZ&w7p;aO=3uGbY)-not8OW=lP#BTjY5@jwn3qok~XkzZ}V;Fn8ZW;Wekx)ADdW0-EcF|2M>RW$i zZAqr&Amgns8=>B5lv=j=9}_4`{O$cFDL}^(p`E{RY;0^c#tI@pz*LyRXN4w{D0xgj z0222Lh#JM9v>dTJ!&Apk5ee;*P$b@1Jzz5m=;R>h*REHoN2Lr86>Mdu)bkV~$15zw z=EwHQ1j5Bg6<%V!q+S4~Kd?p`;8@9Q(;3yyxv;67if{d4whtCx5wQy}#DlJH zzwi8Q(s6xWO2%dI1(0rJ6jgJTMv?${j&$`e5ji&Mi$!gZrncGDSuWmi`Ak{Q2f2kr zF!qM@vVso%Ay*!-`qlD~Cj~%udjED94LU4^R3-vLxZ0l}@ODXRD1}cJbkuQkwR5yT zz|GFY)Qf!Z=5>@g9qS#2qR_bD;-I|Xyzy2A7w8+*?fC@Xq*RDaMPWi(iL>x>GC(p4 zVE$EC7bl9bAMa4)qKTzi%b~H4L{wdvP(`{c3j+3+W?>fXV z;GE)ok@tOA|7GmulwhkiXGw!v1RJNO7))?S0Kii(`YKNy6_qH4V!+m<3ct%`C{|43 z3J(i=qo5GJHk4MhJ>MdxOF!HRcoax)h3T)Aq`VF}-f|{+0{QbR#*Qfqf+XZvNzz8_ zsUpb=-OAflFxXXWKym+#{-&TF(3mZ8@59dwfI2A|@7(XiCMH4gCdS6*#>bNoYu=Xc z7mmrXXi2pB!L3;5x~|T7WnuH{cQ~+i3JP*#*<|nI<3HyEvTGuuyifQcKpx}cnjlUf zn{hwgH3=0qhECX=z2jZ9qlD$H%WU|7L57J7cbQznT5| zwq_-XQLiPSe9oDjO<2Lfw(e(DzR5ZCXpxomi9E0yV+BCi;=laQ@x(1MV!PS8V!#%Z zf``w$jEILIfZlM*Z;a-=*C@~u2F_LQd_bLZwq4H1=|WG@gKGjHD&X6TWfI72jY`{S z+b>P(%V)HK5RN(nH8#e?iXd+VR4#0|D-@**Qs>cTcEd(MmwK-EO z;J&GIgoMk!d-sk~!nY~Y|J0bH&bVu9SRhi)4EmD@2Ic~UJL-TSO6STm_%Sd7KN0Jg0yhf;4EXw;40!YpjA#sf zN!`$^EZuhU=|J~_TTS%H2TXA(51(U~RV-?Al$lEMr&XE+Jh+@NJ|->)_yo7&DVc}f zN@|U`^W$ICpJIWWkd(*^hwR2+BePs$lk9V=`y4vB%S4OsnlV4Rnjyn3`P9Wi)?ky_vYWsN&cK% zdqWQyb|-L#n-jRlIO0=Mg4oaU(5S7 zA1Ny9i!0L=1mpumKLN~{`24C3G|RJXqi50u_6l^Y1AtQH>AS_~RG4ka0`#E5-C|RH zxvAItvcFH@%j)Ba$YPYM7id^T5`;q=mylKvaC7L?7IXYD@v`RCyPS8h=CdJK!73*h zE|CT?I(RO_=U{O`5tmJ+**Mwm_x}KJLT-M;1CEC+p|+#w&Hi2T``@(Ck~C=e5ZI!F zhC#UEVp~49U_cI7F(O6ELb13V^IdfMi|bJk4msnxd6fE8{zk!$;aIAl9a;}JhyaiZDLs<#kymOXe+=dEGQ zL5%>9LvH5Hn%9cTs@Q%MZ4vA&udO8m0WHuEcF2;dRlg?uDYO?FH&IsOngEbX5>*5==q;l9|>Hn&7e2`P9YxX zV(Pw*+PC#IiK$)Hk9Hotj*;8^dI63%R%AXPR~Bf7&+(aoM*N-TNq~O`Q)PNt#SzSQ zf%D*z8Zqd-@4im9Q$s+WzU5plb_(9%h{VnKlJ*BIq`uiQcowCg%^C?He|KhvIuTs31MH(JS-gFl|Xr643-7L|j@2^cJW} zUllJcxpg6bbu({-mSR+!A@koA0?4~R1s%$r2N+d~^0*!DVBTnF2W0;{K=Mz>-2VFj z9zCi3XbrZGv%^J1gB++w=Q_AAW-76*kQgpG9xCMjrT1NA1{c_Fj3#SW0(NFWnz?-0 zb;*)n<)NtaZ>WF2VtIHg(Rm5z^t{A@I~rV*!`hZy(W@_&lB1|2vO5{xSm)Vi%Gv7o zWLXh^v?&PSTt;3^m(X*U=(xB-0i^>=qK7j@}}e{Rjg*Jz6r(R=Vbn2e0>FL=66 zE=j8N(tU#Y9Y0V?tV=BZl^W0uu-h1(BtboWD*#BL28^aSIi23vTbIGnULCD~dpucA z=LRj&Ta&w!-5FeHsooU^6H95ggz0HJ6f2fOH(Xi4)j*&LzTaaupQg6?H{jMkTKV@X z~!jONLqZKR% zHhPC7w{GNVP_C~3(sZTx91_NRQ9ZHwcilvV4G7S~f`a?2tP%9+095p+Tl&A#Wy6Xf z)@e1X79HR2JS7F~G=*=G4P*>T7Hj!HirtPT|FeuVK|Rg@e z5e50N0xfR0rU&5m&I^2wMEz!~0(2yApp*WeX@W%DTz?xo^6p=&7SUhxA>2gw>}B%6Tqzq7c1i!5SmaJtynqn%RQ_RqiT_!OUm4Drr9l%e3=l4+XQM%w1B&>m2d=MnXOK74&bZEOVDDm3D&&^2`{o+ z8w51d%VTOp9*oCL+z3r_8UxuT2U!M1bW#c=L%dX?7qgm;Ks@Es^p`?5yhX;1u2u0q z-YfditfRe)=p6_M?F_%%0bNu*4C+w?=?I6b-ELy<)da{eYnj|wSK0eIG>@14 zk`R=(gd2m>7IY3r0A!f7N;HwJnfgz|$vMqGuR;J# z0WJWxHoRFLUO=jyWpYHi}wepZOi&3hsMt_JB>1w}=4RYLq{wR5)PpItvc z{1q%~H1Y(w=4yuoHZ65EwNc$TcTKtYqJH#-_+l09&@4GO58I6TxxTFoH(Gj-`L;flU6(8Q_eE9<;&@Ay8c&q6O?!`IB6a7E$Meo;t*OFoUzoq2PkoVp1 zSM~NY>M=1fwjgCl>%05H!rWXKidH*g0dyR*`;`#3p6N5*;^8!uDxerGasFk&?*w|Z zv$%*HL+@rOD5#L~0#zxMpqYxtqF-aC*BXWVm=*+D0J2r{p39Ly0W?7RrdtawLGB=x z(hcg@ToDe9NaBD~>6k5$^o(V2n5pRrt3mgeB}Et!DkCdv_w@roPeZ`rPubXf5Uu*O zFn}*Rt$-H}bn3X$4!A%pj)PbplxK2gp z@11`y7)=wWOA56z2?$KkP*ZO@PLw40>@2huNN{m-4srgNf8l&`J+vzRV=HlPyHI)L zI#@X^wJ*{A3}rNOc}W-W{NRA`Aery)N8jW3SH_al#Q(lTJ6F-|AOrgBBB@$@PPVr| zK;GB_QdW-g+jVtywKs?Btc7;R4wn+kxUi+NBKlq%?uiiI^i z_b@tO4yB|X>k%0-0$o%Hq++66A9AwbQ<=zZWVmt-s0lU+iG`dE^met}2j&;9 zDyik}-q7HHD7;G}O42;C>TClFQD8@t`ZOhIJW@pkXah980WyceP~i74mg00m(Z=Tg zmlda^ORkv0Ems!>DSQQr+zGRF?_iYi1!WvI^P)EEDmIG}F8Z;-!TJ3O1-29UOv?Gm zkE~F)mRf3R3!p6^rAV8z^|_~VoXCB>_b`Hen$y)ChtYmSng5V`>(CY zIi3`63D_w(AQYf5x%n2wNJ_7IdyGUe=T{1U~ivkdH2_?rCrLj}e6h9DEwKb2=NdTHdE7#a=GO?hf$W2al{XUH0=`ce8E0bX&Cb z+VsxXr~ogR-};=DRUUR`$;#OCfdYe6Rwb&=xB2kuWUaz1m*iM4IQ;nGdNs z1RQMJ(`M`AxH{(Mj!#Y&7H>(NtvR=-N=6e>mFZN!{PE+*`C1zP(Pm11C~a)-Cmy_N z8qwt1L&?j|q@b<+gMw&@SVPY)YBhcv`g!kC0?MNe==9EWe}nT&7o^cmti<(nI#Js% z+=u3f22R8|=JXRuBfaXE=lhB-x^>@gg)bQ+YX+2_+04(TUpB2gfENr<9q$PJDp;y9 z4H0Q}-p?m^1@;GG#Oa2zgz;bS*piW|{VzDgwA!gd;MYo`{-8rZfX$_+3$ER{E3yHR zUQS$~U-!N4W0}qqs9OR7#e9pAFWv6$TbJItfB@v5H#QrZaOEnf*h9-KKW*54f6WXY z#_*5+*y{@;n`3*MVQQNZ+Jl=8X*^_QfWW-8e!b`f8|p)U!q7TG3z9MGzL{)ub+#>b zAR=t}2^1KuRYO}+cgISTH0w)T+^~1W(|4+-_g4#1YTX};8tNU`kG44@sUWVOus5p$ zI*^4E)p;Umr$a((*`Q9QhOUZ|lyTmtlA=!1r7%9mD0%q#a5>s?NpO?LrEt6~#mk6EH8GKk^X!V< z?)qANv0Ys+70K3M@*c^wzuV394WlXv;n15i=aHq^26Nr2FSKy~hR^5e-;L`MT%y6u z=aXGYa90p>EyZfke;Z-ddm!^lF5tSBqGPHs@^DPCkdy#J;iYl)bfNMXDTHKkp*RkC zdv||ep^~7-!YZvc^y)n21l32U>>=)SGIe|q=Lq}JdJR`qtnA=oWJ-OE)5+BrorZm~ zVh(q{?!vSDga{`cQG5t(Z|IMUWSXAQmE*`R*SQ*vNUYVTo z!?As)?1g}DQ=M%BTnnoT6NFA-VT?{4XO?i%Kl2`K`ot=_HQ&-{=35|ot<#4?4M?dx zM<}1M$G-W)e7y$#t0hd&#aPC*l^3SDXLGa?b4vH0TSXypwSQXq0c*G2j!+V;^>3rd z67p$4D!*M#81vbYXI2r0GGY{gttF##8kS1PS7+pNG#O*ST@?GZ96dBBoMd3iBrB)l z4$F;gHYjwnII`tSaGt8LWU7Xfm)=^UaBNI@QsrV*EBIr!zL4=a$tZt4laHBH&0x8= zP#-lSnO5Q4)n)lRD7eB*%tI9V1j7jc;4=3uzQq89gJmlg-%GD4u^qXNo3`=VqQf3? zOF=rsM7fhi6EH8Z9V9j6Xl-o(NlBH6yV zsyss!1W2^CiDY-XP-G?- zeR$ExdxO>G@zK0Tp_X;e?V?hw{v;eiCGtYUw!!u8%QMT~PE=(PVyZ_@>A3*WzRO6; zJ$P;i!3QIMc~$J}RxpuGd#mmD!GkH+Ht1s4 zw@>`fWMHdgwV#)_=f`B}K$UO`S6=(Ih)HdyRBh*4f5O;Yb79)N+f<4GRN^{$gfF}G z37CZe*1!Y=&N&FT9OgG!-EJAGOIuxi%)l|o!GHGcp(W)?*ZYEWYOp@O-PLAeajL19 zzm0sKw4D{E1UDLW>>p74A~fJC_VIARTI;wGnBVn25yW&pwhty$GemC#R}dr1_d&AP zUjwb2#DA`}O)TOZE{bkx1e z)74;n+=<*^<4PKE?bB}>{bWNxEVLL|uAi1Nd+LA77vLq+>gx65rt2%^Mo=jwuCFQ+ zm+3e>4os$U#>Q0ws?BEf@j*emdDz*Q zlYx2?7gH05j$=_!X3Q?dwB~98$ZihW72nNq<~lttnQ# zCW13^FnmLXKd)R;^hXHt4g73yP=VZ^cThn$;nB~9b& zOaEXqHJrYr-#Coy$4KV}q2kx>k*#+*IfcYKn=_f^MY-RH1mY;nEmCx?Oij}(zWZ>s z47$D__z^SPnB;%{1I)o{D8sIB#P8Y*`BQf2Cd{tl9gHoV9juWXv{^lsw`Xu|vMhxn z={r_@AUHapv*`14m4KIv_EM+c~oFVtUbdS@wm(i>S&Z8r2Z6JztWF)Oq8 z5wE1=_4JIW@4UWKO4m_kt0_!IOOt@0@W$inym05F#saL0=SZ3E8pmasuBF1k%{9b! z>>IK~jqK&iLHXjLv;v>)m`r~?*vbRG7%c1qOdmj2hOueovsYy6Pxt85eDe(=qI0yo zEdFC^R^WAzU#L7JTPki>alqRVR0;WS(3gL*-DrLMd9| zQQuH5-QTVjXfMJldw$4+!W?b&yS_^s@7Vg&_nmU`lB>Y+KT(3U;GhrV(H|4sDy-F? zvUDlh2_uq1aNm(k2c~(cv&pI)ubqy|u}}J~m(F~4ztMgXcgYp-qxnuo2SFE$H=@um zr*|y{2&bedIw3+bKCoAVPPyi&WVRBUZMEw)51 zXnq|(oYQmRIb3C7)G9_9ANZU;kTF2|x zG-9a~9%LMEVf0JC!Cu;kUoK(uX#LUAx!8CYk;hf;emv4X?BxZ$k7)i zdJ{@s13IK6|Ag}{>uXmgZj8rNv}tclsh*!%fq}Ad0d5;!6rD1gOzJnn^;B9xp69(? zmfs}O)>m5YA6>ax2mJ%aVGOO))JUqKJAoq-?2)t%y%qx2ORic~Z%lLf1KN>nmjIL= z!&TwRciv(FM!fmbx!BnP7LpNxN5{`T+i_7r^5~DNK>Jhv@w(qo_Y~bc(=+EHcC6u{ zc-BI~>8|&MV$(*~^fz!IR#itlnRiPbN# zi}i(&eRLTW_$-bSZ1Amvyy!vKo}JdGGOxf$eYN0)mWAH}t_ED&9A`DpJ8t6k_tPux zuq=X1f?A`aWf|uD*Kn7X0$!r;{iu#YT_l#2!^Rbc-e(IB z#6aeRDhXAum?J+@4W2x+Ys9bs#SM&E0oTpw<81)Jql5Gj$(vSLqe@$?VyGA_gw*rK z4+&Qtnwk8Zm2`d(~;4|8bRJ8S%fK;kb3S-~-5kF)Amy zt}YcwNci9?uLf;VQQEz$X){YT2|`h9@+gq+MxW>bYl|+X2E+)exF~Zh>*mr*{O0nY z|9C03+3#E~C1q`?n%-ySzKc6*H7TPa|F`w{_sbSU{XiKU93=#6`5c5?@T;}aC&-qa zK~eTVPGGk5j1-enD{7LAxaM7mvqC#V(8mBli9y}lUoW8nS4T1pCp(Kqpd=ZdD--ej zcvd+z8M`lhj?@0y*Jj@w&R|rY3ZKyA04&c;x1f_?L>Z0P8kih62>gKa=qPpH8kD-w zE>Ewx&7zB%WUBi_$E}{WTB8Yv->=C2aaB(fwEX(MKvB74`yq3B1%CTRD4h~{)lNI#O<|_5`u?*19f^EP zWxmG&Yf3=*hq5m_t|DKYb;ZUH@bdDXwruWW)jJWmZ!|j&Bv|DePm{pQ1_qy7V}>qEI3gk0Aj|<#bH!!58cK@~+4i$Ob1N zcub`sCpZBoavw8ZNM3&JV&iB^*=}Gk#nQbx%`sQ3wvrW@zaLJ@9-p4RsV1|E7kZnP z?7@RvkXhL1CYI!=xq445p=NJiHd|-2yhjPDaK3gAl`*W&7b+JTU0j`{dF_~F`CsMR zzz0{O1I!Dl5gmaUU5;z0K;HAo z%f~Eu^|>B+?Y?+PsPbb(2x{tm_$-K#bLjFGTQHzuh$WuYE|%+C!2~5w(&OWnT`dB^ zAtS?4kZpa`U8zyVVgV#&*@Dch#K*L?N%-moddF;t-vPXuZE-bb4^ z!SjwCQ12}PV({V)>pbyuyx6R1Z9MSQ?c+nCX{DJ+uH za1&f~0ngh9pvDlKno%SWW+7hAuOxx4iIsS^lyqGC><=#(v z3u+UV!j!Xx0N?EtxCIU6!3A{c$XkMTO4@&_5_LX)GP|(2=yCQ7&!!V2ZE(IiZ)zg@ z3y77iu!sUcE@m11y8uiX68rz~JLgYLbSh@~+ja{lan&!Z;?dQa@JiLOK~%gC->~w* zubbWM(&9UO8mAI48KXNNF#i5+zweiSmk_nM$mA4FweH3!tc#7SqeCHKKq)qfvRw*E zGD;j9+mzL{EIi`Eex{tJz^*N)D(MiBI9|!!wtpK^a36}#@n$8QJ^u)`MJB)CkC6CA z=c81j`2%J9mTkMa&+$F(OileicSS_hJN(@(>ST#8-Xx}OxM>C6eET*{&qyT*km0QQ zcO+791m_>zTZt^OnOq6nbh;4Tnpy{)H+@mZm{Gd|rXQ3$ccxTR`O*Et92OlVTbWeq zRt<`jV)_%0U~HX>C0ez2VIB)Hz-`%%%TYd`ZYKZ_zK8WN1t09^=ed3o~uR`Cv#;<)VkYtpdMjz-MQM;df<6Vj^el#Fgg_mdsRhZDisj2?Ota zdE}f+!IWV{`i}e3TQEd;ZIQ#{v%Nk;$UdUnz{bp5HY(nB@(@Nz5-QdC@dGrVt(^XN z&czV&;rB}VkcRD|q3F(Yn%awBT5?sm+u&IfLyuAkM_ z?Fp9NCdNIzIvZ(_?A~hhff9vlJhOhWny8Zq4L$Hr5*IQD{4sQH4uVG^8VYHHsPcm4BuY9bvLO4qA!^+YwBpLoRZZNSp0|(j0-ZmL_)V*_@GI9xqT|Oi z6ymdM^($-M(ECyAwIlZU(}O933>Lp%u}UnUN&^4D8_JCb1h*Tqf@5C`EFpYJ<@ zRV{&VquMeBhfoUPjwtPm?6xEAVlDQ{(iieTmnv?nWO7{XMURb0`atjBT~Du9Jy=sO zR&Stua`6;%Av`RmqDAHWH(}Z*Nyl`}#tOH~)m1MjjT%1?Ew^5Z<2C_i{CM7REMb#&TsEe$Q{u1JS~|IM%(Gd;2~lo>;;d|IrdN0YL*%XKy4p z?>QDJG^>zyu+BG5b}efhX4<%5E6x=`<^}x`2H=I8N;(T8lQ)#8b-XwZxVxJa&GR84 z(4$sq{=rDng14eKk`Wk7E6^!Kz;;?8haIA@+CQ^lN^WGIaVOB|zD}+V;N|mPH=N~W z`5i6ENqI=BKA-`tpapRL$N* z0Z*!4HJ4V@Jlox@HH0|3j!4)^cYz;VP*6FBQJyN-+a60do5>;rZXlFmiPh6ZX)XZe zBWUFo{nWw2Oq(BDWhESM zAHh=9(geXVNBPD%(}!h2d8`nXREc>(MJoR9-ncH#trcv%SG(_tD4Nf0i|rs(SiRwX zQY$PPy)XL{IUA;C>TKLs4;v6=@3D5lp&;1uUF6b>w9#$y=H^L+%cO1tLgel9uIzGJ zA-590t_FvJB)fOcD&ALaRBRxRf%6Sm>DbuTiaVXi&&k$776?Irtn(p83F;c<*n6nT zwu-wy|LMfiDz*G&eCbKZ<^Rk!-ogFocf{oTyCgC@3xcnZ2q%Y$lD9gTBRlTf@c<%t zAID#>2jq`PCc!*TU~CwSIlf-V?H10a=evPmZPhbG8-jKcISnD9)-R2N7^oBux{1f) zSq&kkEqma10{HEdfnHBdJf6!hkS~QOk{diOC_=Pj|Eik$yeMo%gS(!=%&BV%(OK~9 zCKJK92Yv9+VS1~<;W$OqrO-iQCNK2xS17u3DbV@F5^`c7_^Ya<7o=}EV=Mup;4rIW zjH%L-Vx{1+Hf?7Oj)Nenj>4 znN<|@oz1vhs=xrMU3=3!8&64s6U~t;!a@Jw?0L`3%zx42)JQXzR~em zM9d_(E}&zIlz!}Ob`E^7|x9uRjqc>XF# znl174P5J0N>@7gPXYjN$}nzNe5!%b6UB*4GHR{3_v=$<@I9>(owuIn zHi*3jhB7EnpX)U+XzVifLPlI zAfp?ky@0n_`Ei{0KsZBP!{N`b@nZLc0)IckKh4dC5N%%forb8O+4^$4L#Kc^i3_Fk zZaU8!Ocn`?ex0Jx{scjh4l7mtusRcIkRL=;o%hkTRXq3=+!_2dp3Nd|4KO&g{-=lH zBhiuyG-7%zAVaaId?C@7#?geDAA;kTBbKVZ3YBv#^={qL) z>1tmQBG*nl&aoD?#f{(Z|BcQ#`vs(GleEU3>k2eftLZ=ckU`MC| zRArLwWF32<-^DCx0tnTH=rBD2Gte^D;#{CSPAAYW5#V!FGxB9Pqo63WW`q-z*P4Y# z)@Me|8Bi_yFLgQv43=>qK5rk4I0WwmTunIzC}j)Z!V=^;1fnf_LL-(xS?=%Ft2=;DK?MNc--FS)9&I$~WVB6Z_H4YpSD>GW$ zHmZ{YTw7&n2su87aK*-iL%_!o$wmv+fB}nHRf*~__eDSEwv$X~8|Ed`BVfO(CQz1x zRb~(a69^lvXQy`iUR>*Q8>BkoB3n-Yks%>r2#n{&?~Vf%@C!RAHq2~m^!&La$mDOX z8~I%dU4Mlfr%dL&*USmN@|%7pRwOK{@hjjKS^6jr`SfV{pb{`IE#^MF`v(p;5s91* zgO_-8)3>ZTM}l8askXTm6B%tzDg)4+M(F%2q~WXbySoX`DMUob&YfD6&*yj0_9ukh zu~}xeRadWR^d(sw67xgtw^wQLH*>(;*EweJyO$}?Wxuxg4kXIc`7!vN=0xIxS^^M0Jkss{IOerJlXZkbe2Gyn zP-sx;xGp3V0!5Si2N7cI15EqvR}EXXJ{McZW}G~GlI!MH2#Z;A!>Ra~^)-7Z(>$LFf@)hFNgu-aXY7tXGIYzD||mS493 zR$K8Cov1lPNw2=fu;(t#<_7Z<9E`#1t7ETb?|RPX`!iO@R$Z|_czDS4Y$s~;BPreM z*QOfzhO45Arl;cq{MYTder?Y;xOIa(5%}p90oN~*0q~HApse#uq>3b2a)A}v9t(LVTz21+nB6h=&Ivy@%}&BIrng=(>9KmrNXwh)7p)wDAB=gMMjiY z2dNy^AuLK|QMSQgWXB;&MH`(M$)N~?3^F;)$mCGYBPryNV<^WclZf~G*uAdz&-efL zdjH_MX0DlQe)sdcpZk7(&-49$>N(058|HV|YdDrvs8c!ZO4hl}l_&A9{@XBgI=e>AdZMQ=sRwuozP z5l|gtPgVIGNk4tl(D`M@d+~YGM*`0I#x}6rK2D8~4@pc)?QS|Fr1DH|#(a%yxwq#B ziX~kDRpjaFy3K%&r`lV;^=qY>%HMDxY&Me{eH!YeK=6#kAk}<+ zw~4qQ7BNI4+U?)~gvw6%%ZN)$&d`#8w_qYP-u>5k4~TnH!B;5rod)@9`JtFa@{EbW zI*^?nZ~123W%V#a4#Ok9EkTO^Hbn19Rt`0|ytbBn5%8$9wqP_xZT&qYuqeT3O>@@C zOVINsjTBC?FQmboq2rc%Bt2^Dwr%0Sm3b;3$Hu=1AUiL~07GTA@@Knq&q7x*iv1n2 zZ;Nm1iJK9_M?C~@L78JRODqrSK>UnFu8R{$PF%oL9?w|>7Rgi}r_?yqL?sd?mH+1w z`CAbYNf>~jR{tU~X_m*k7jovrOYm97!qPB%m+u!R?6_$*&-Uu9zDr0*uyx6q5kcE$ z`8o0IIhU;Z$F!n6N*5v8vc3Dhsp z9N5H+i0H*c7@C<8@_9Wy_RQE=xiO8HonCZ&*bVS7Pk{T_ASJO+ze=S7^cU3k7gGM| zvuE7v3VK|i>+*3Hz-wx<%*CB4o{Rdl!GMF!U=38J-ulOW~VP9EY?E!-v+d7v@ z?JN$WR^C$H0vHLzt}iHhJiSz9)1*9|)g51iBO^r5x&t~$>2DXbHD#TQapy1;U+0{; z1D9v4K%1ZLDUNJGvQ^@>GSU86c9g?J|+n0aOjEwB}o0)VBOAVoVdwa8W zgCvG?TBwo~lf3R;c48M&iJ8lN1#h{wi$u5>RphpuopkK~$8i zt*ES|iHnOK4ZZoE`aO2q-{N}4?w6|{xv^8pY1a_ zHjK@AHvt9eU|~K|pUGrO(~ctFB^Xo?Tn0q~&P{ckm(mp|_oqLwF1byi7DH--B*bp~&Rz-$|Hb{_0f_g@v%tl9g}G1Z za}plNbf{S=EiK&#LSjEG4(@yH#BnNl zTIl_R!UbbvV;t;cEGsnh`)XO18r*17XArer-?`yIovD$wXX!zI4x`5k&d_LgQi<8z z_bTDg*8*O}?TvEgV0iU8jQd2*+*=!$!93B(_CXe>gm8x6mCrUfB^*_^doqt;jT&v-4LY+9ZOPvY z{1CHrN_(lIlF~*BWinED=|2fq!f=uDI!n8_gV3+2ZQK<6{Rzh6x>fukiRPiReYmvf z(dfXk%9(7bTKnR!e!?Y(N$@ojE78vJ3hetqbL(VMI*Q7 z<}J=oo|cw6jrZ29DU+Oe1GuDWW$~=cHiy4RmJ!K6oZ#j#uuG1h%)MFC9W;()g-yJe zPRbrgl7E(VQ{NO&dZGhQB8;TNKM`a0q$lk`6hz+7oKqG#R7c)JYf%RIEb$QY$h#Mb zpTM_zmzGh8J<&vBT}MP@DRP5An1WZ50I7^2NUges<>Ijt#c;ha*?$FYw# zi6P~xQO@6m2iAc{r|S3Ppm`Bx23R{4IB!5?6SB4*j@J0qtId!2tdN}*m}_O!Z%tN)+ZaO zYL!uvfhZ&}ysWIOeSR^rX-R{FgT;L%SqAtSATEP)VR^vAJ>47!j#zzsV)Cbh=wUjT zIK~+LPguZRlvQmSO$THOf#KXR{Jw(v5*u_&#T4934rBSEWc6LIqt+ImIvVt?QfHf2 zyJwNz^H2SCB>)E`yDqyIcs0#IspD>1MPns$dooHOfV8tWkceXs+m!jM%7QM5GMizYYI+pYj@727~e<<1Qf1|Yj h|8maf^hCk$%ht6E{5NearP}}i diff --git a/matplotlibcpp.h b/matplotlibcpp.h index a16d3705..ae0295ad 100644 --- a/matplotlibcpp.h +++ b/matplotlibcpp.h @@ -32,6 +32,7 @@ namespace matplotlibcpp { PyObject *s_python_function_grid; PyObject *s_python_empty_tuple; PyObject *s_python_function_annotate; + PyObject *s_python_function_close; /* For now, _interpreter is implemented as a singleton since its currently not possible to have multiple independent embedded python interpreters without patching the python source code @@ -77,8 +78,9 @@ namespace matplotlibcpp { s_python_function_xlim = PyObject_GetAttrString(pymod, "xlim"); s_python_function_save = PyObject_GetAttrString(pylabmod, "savefig"); s_python_function_annotate = PyObject_GetAttrString(pymod,"annotate"); + s_python_function_close = PyObject_GetAttrString(pymod,"close"); - if( !s_python_function_show + if( !s_python_function_show || !s_python_function_figure || !s_python_function_plot || !s_python_function_subplot @@ -92,6 +94,7 @@ namespace matplotlibcpp { || !s_python_function_xlim || !s_python_function_save || !s_python_function_annotate + || !s_python_function_close ) { throw std::runtime_error("Couldn't find required function!"); } @@ -109,6 +112,7 @@ namespace matplotlibcpp { || !PyFunction_Check(s_python_function_grid) || !PyFunction_Check(s_python_function_xlim) || !PyFunction_Check(s_python_function_save) + || !PyFunction_Check(s_python_function_close) ) { throw std::runtime_error("Python object is unexpectedly not a PyFunction."); } @@ -329,11 +333,17 @@ namespace matplotlibcpp { inline void figure(){ PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, detail::_interpreter::get().s_python_empty_tuple); if(!res) throw std::runtime_error("Call to figure() failed."); - Py_DECREF(res); + } + inline void close(){ + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_close, detail::_interpreter::get().s_python_empty_tuple); + if(!res) throw std::runtime_error("Call to close() failed."); + + Py_DECREF(res); } - inline void legend() { + + inline void legend() { PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple); if(!res) throw std::runtime_error("Call to legend() failed."); @@ -377,8 +387,8 @@ namespace matplotlibcpp { double * xlim() { - PyObject* args = PyTuple_New(0); - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args); + + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, detail::_interpreter::get().s_python_empty_tuple); PyObject * left = PyTuple_GetItem(res,0); PyObject * right = PyTuple_GetItem(res,1); double * arr = new double[2]; @@ -393,8 +403,7 @@ namespace matplotlibcpp { double * ylim() { - PyObject* args = PyTuple_New(0); - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args); + PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, detail::_interpreter::get().s_python_empty_tuple); PyObject * left = PyTuple_GetItem(res,0); PyObject * right = PyTuple_GetItem(res,1); double * arr = new double[2]; @@ -499,7 +508,7 @@ namespace matplotlibcpp { PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_save, args); if(!res) throw std::runtime_error("Call to save() failed."); - Py_DECREF(pyfilename); + Py_DECREF(args); Py_DECREF(res); } From f9a8f6e1e9b17cddfa2bec2d9af949f4bf2a10a5 Mon Sep 17 00:00:00 2001 From: Martino Ferrari Date: Wed, 23 Nov 2016 22:34:51 +0100 Subject: [PATCH 2/2] Added contour and imshow plots --- matplotlibcpp.h | 153 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 127 insertions(+), 26 deletions(-) diff --git a/matplotlibcpp.h b/matplotlibcpp.h index ae0295ad..2fe4b7d3 100644 --- a/matplotlibcpp.h +++ b/matplotlibcpp.h @@ -33,7 +33,9 @@ namespace matplotlibcpp { PyObject *s_python_empty_tuple; PyObject *s_python_function_annotate; PyObject *s_python_function_close; - + PyObject *s_python_function_arrow; + PyObject *s_python_function_contour; + PyObject *s_python_function_imshow; /* For now, _interpreter is implemented as a singleton since its currently not possible to have multiple independent embedded python interpreters without patching the python source code or starting a separate process for each. @@ -79,6 +81,9 @@ namespace matplotlibcpp { s_python_function_save = PyObject_GetAttrString(pylabmod, "savefig"); s_python_function_annotate = PyObject_GetAttrString(pymod,"annotate"); s_python_function_close = PyObject_GetAttrString(pymod,"close"); + s_python_function_arrow = PyObject_GetAttrString(pymod,"arrow"); + s_python_function_contour = PyObject_GetAttrString(pymod,"contourf"); + s_python_function_imshow = PyObject_GetAttrString(pymod,"imshow"); if( !s_python_function_show || !s_python_function_figure @@ -95,6 +100,9 @@ namespace matplotlibcpp { || !s_python_function_save || !s_python_function_annotate || !s_python_function_close + || !s_python_function_arrow + || !s_python_function_contour + || !s_python_function_imshow ) { throw std::runtime_error("Couldn't find required function!"); } @@ -113,6 +121,9 @@ namespace matplotlibcpp { || !PyFunction_Check(s_python_function_xlim) || !PyFunction_Check(s_python_function_save) || !PyFunction_Check(s_python_function_close) + || !PyFunction_Check(s_python_function_arrow) + || !PyFunction_Check(s_python_function_contour) + || !PyFunction_Check(s_python_function_imshow) ) { throw std::runtime_error("Python object is unexpectedly not a PyFunction."); } @@ -124,23 +135,112 @@ namespace matplotlibcpp { } }; } - + + template + bool imshow(const std::vector > img) + { + PyObject* p_img = PyList_New(img.size()); + for(size_t i = 0; i < img.size(); ++i) { + PyObject * zi = PyList_New(img.at(i).size()); + for (size_t j=0; j + bool contour(const std::vector& x,const std::vector& y,const std::vector >& z) // dosn't work?? long n=10) + { + PyObject * xyz = PyTuple_New(3); + // using python lists + PyObject* xlist = PyList_New(x.size()); + PyObject* ylist = PyList_New(y.size()); + PyObject* zlist = PyList_New(z.size()); + + for(size_t i = 0; i < x.size(); ++i) { + PyList_SetItem(xlist, i, PyFloat_FromDouble(x.at(i))); + PyList_SetItem(ylist, i, PyFloat_FromDouble(y.at(i))); + PyObject * zi = PyList_New(z.at(i).size()); + for (size_t j=0; j& y, long bins=10,std::string color="b", double alpha=1.0){ PyObject* ylist = PyList_New(y.size()); - + PyObject* kwargs = PyDict_New(); PyDict_SetItemString(kwargs, "bins", PyLong_FromLong(bins)); - PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); + PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); - + for(size_t i = 0; i < y.size(); ++i) { PyList_SetItem(ylist, i, PyFloat_FromDouble(y.at(i))); } @@ -222,9 +322,9 @@ namespace matplotlibcpp { PyObject* kwargs = PyDict_New(); PyDict_SetItemString(kwargs, "label", PyString_FromString(label.c_str())); PyDict_SetItemString(kwargs, "bins", PyLong_FromLong(bins)); - PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); + PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); - + for(size_t i = 0; i < y.size(); ++i) { PyList_SetItem(ylist, i, PyFloat_FromDouble(y.at(i))); } @@ -241,7 +341,7 @@ namespace matplotlibcpp { return res; } - + template bool plot(const std::vector& x, const std::vector& y, const std::string& s = "") { @@ -295,9 +395,10 @@ namespace matplotlibcpp { } template - bool named_plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") { + bool named_plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "",double alpha=1.0) { PyObject* kwargs = PyDict_New(); PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); + PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); PyObject* xlist = PyList_New(x.size()); PyObject* ylist = PyList_New(y.size()); @@ -335,14 +436,14 @@ namespace matplotlibcpp { if(!res) throw std::runtime_error("Call to figure() failed."); Py_DECREF(res); } - + inline void close(){ PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_close, detail::_interpreter::get().s_python_empty_tuple); if(!res) throw std::runtime_error("Call to close() failed."); - Py_DECREF(res); + Py_DECREF(res); } - + inline void legend() { PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple); if(!res) throw std::runtime_error("Call to legend() failed."); @@ -383,8 +484,8 @@ namespace matplotlibcpp { Py_DECREF(args); Py_DECREF(res); } - - + + double * xlim() { @@ -394,13 +495,13 @@ namespace matplotlibcpp { double * arr = new double[2]; arr[0] = PyFloat_AsDouble(left); arr[1] = PyFloat_AsDouble(right); - - if(!res) throw std::runtime_error("Call to xlim() failed."); + + if(!res) throw std::runtime_error("Call to xlim() failed."); Py_DECREF(res); return arr; } - - + + double * ylim() { PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, detail::_interpreter::get().s_python_empty_tuple); @@ -409,8 +510,8 @@ namespace matplotlibcpp { double * arr = new double[2]; arr[0] = PyFloat_AsDouble(left); arr[1] = PyFloat_AsDouble(right); - - if(!res) throw std::runtime_error("Call to ylim() failed."); + + if(!res) throw std::runtime_error("Call to ylim() failed."); Py_DECREF(res); return arr; } @@ -645,8 +746,8 @@ namespace matplotlibcpp { return plot(x,y,keywords); } - bool named_plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") { - return named_plot(name,x,y,format); + bool named_plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "",double alpha=1.0) { + return named_plot(name,x,y,format,alpha); } #endif