From 60fd538a676ab44a7aceee5559af09b7250d1f99 Mon Sep 17 00:00:00 2001 From: Dimitri Lozeve Date: Thu, 29 Apr 2021 21:14:23 +0200 Subject: [PATCH] Add borders and x-axis labels --- demo.png | Bin 25947 -> 21621 bytes demo.ss | 2 +- uniplot/braille.ss | 9 ++++---- uniplot/lineplot.ss | 55 +++++++++++++++++++++++++++----------------- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/demo.png b/demo.png index db79963bbfb4c78d109e4466c3cc626dd58eb8a1..8fc99f3f74ca5338852c63e49f6848a526bbd71c 100644 GIT binary patch literal 21621 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 literal 25947 zcmcG$bzGF)7Bv`FXBNRD)a#LxrZ zJ&5P=ocEmf`{Vn4>Q9_~-@Ddc>)LBwYmFhwic*;9B z#JwL=w@4*FBa?YzcPjwJVCwT={I?pt?>nwF=5jr*%^CH=XLikYw*;%Fx2x+L=>?la z^yoQnqu+Zo_?V3Pcv&x=IjvmsolD>D1Kv>fc=Opu5r$AH$|w6$A5X1T5T_@LiO1eT z@^*;j+rZjT?nK7bA=io${g-S$`_j{Xp3#Ap)0~~SltnGywzEZ+G9jg> z$9ij9Zr*Iln&g)bh;{KeF9^jIB2kd!4f=E!456!>SI}HZ z*uAAHStisV>@FgCs{h@^f#Hl#tgLaNol9wUAnd&t(#W+98O^^z{w zT)d9vB2G_j+CjQi0ru1FaeJPk5q}})Th8T{zQ_%2$&>Yj^N=N-|08HuzH`-z1~KBm@G z(iuK{Z@s;a2=Ohr;4z{F`SzE;mvX`NJP)&Qkucu>z+I7q8Tdg*I7{;$1&oGp!}Tg> z$$huohgj}b+6*5XS1YQ2;;b+V%2K@m$yhDvIBv}4;XG*40n&3aWIT(f0lRYlRIQ1v zZ#m|ynG(V5Wua5Wu(oI5cxR{Y^;zH7nH}q%TSi{S-qwML3%9-&?5CrDq2MO~W9?yX za<&Q*vM}M?lZ7vxk)E2{1e+XM!Za11fhiMTOs-k4W0A;em>!k$KuXKf?q7L(ZpY^z zJ@^Pg_-dGn&!>e$ej54)bnjP`GSwNao(n(CbCJVpVx4rUX#SR+Ou{^U74G^&9dzyj z`JtA2MoWuddEvb3erz{a$B3UwYycf9M?j;oL789Q^>h!A`i!HB=Bp}3kVH0FJoDT` zk55-usPc_Af|yGeYw(}-%$=loI#cO$4*4WC59^=iUM0@FtjM*e!NVYmY*z97!3(0k z2o%X5syfqk*bYsHgnSe1PH}hYo)?T6eh>9Kz=ItWHDzq&`!ahhOM&s3I4}{r2(bG3 zv0RANA&2k*x2wkG(yoOav-dPJHD<0LT(_Nt!t7KAw4mi{yoCpgu&rGneBkJCNxSd3 z#^``57d{4SGCf12!3~-e*#yhYj@@c`AaTZm;%DXEq?Cu%w)b8fZoDzg@x6#&Ioxz| zY1(ZTP?(UMn{3`B!q;=Y`?3T;-%p{`u#X>4qM%H@!_SO5L^vU%f^@5_x%OSIId zg6E6-KfRm@d=YkP4>tui_R}5YU--5R9+>Hzu#(32SNk3>*lqey7AK`BgAGgEjr(4n zZpHW(+Fu-MnrEy3M0u>bi<~ ze8MOnvgOu2KfCPZ%lJ8T=z({rcJ)G>(WVlm#YNN4Xhr1$DIxD>Xn8n4JmFo9(euWg z{OSj{Ys2oTn(o$nS(saP*O$gOpCv_0@;Htl-V7Ji>fW*N*PmQdNK;XaBuTr%aohiK z7?(85$iLD=RY+93&T+Z_ktWEMH0>(pa*JPWoAQHUJ?|q+YOD?(ad0e;@RmWDsMmr9 z?ro*s_>k$2BaSiZ?ZI9 zIpSg)ZwKynyVeo6tLCsEruj6arp(5^*}tgE$_?mCB)kHdvjG_SN`X)uLA&)l8+A*j z``(Kc;^+ZCPaRC9(NL7L_m_23>P?vO&^Mq>l< zR5walYc-A3;GLA#=aG0SfUNmoS0U>z6Iwf$lpxgz%qIqThSQ(PxlzV=T z4Y1RYT?L!bdm(HqHyxQWkYWe5dm)iA|T(AO@c!QZT;0 zD%WAxU!a1sxs-bla%!+xFfD9Mp`nm`wzOuJbM|T!H!vfIGL7Ems8-SDEsE2clf~|u zejzb`-iXdc2UgQ+2s;Sf^LvO}6*#*%B&L~YpJQs{>(||cttU96^O%|T>h@2MXV2YU??}hf^TT<{42Lj-xpst_T5GbB_;JX*_rj(q# zaaRhWCVmnGQS(oqf9gTm`m=Y!`dsm|(B*<9i;cNYYL{|&3f$UjF6{k&Z;86Q{zgnw zbo~7*rHO;o8rM5RGb{pjFt#+0{B(7kn3^N>j@=QA6r2f`aR?w^Y`2B4GkRj8cDpJL zvk&j>B*3A#F%~~7t)!*ETSY;^4K9o!wLe$xi}Qi@$4kuo{z4?ytb}?~AST^F=a`F% zO~j`T{ezQTaRQ)FjP-9YIo@Rq5{5PyPg6i-$8%??V^#Q`5HI*(`i1B=2y~u?5ko0YF|@&anZ40*P6XO-`#8Sz zQ)WAb--Z(LqDqqdtfw*3W@6xRl{wP+*{k9U5PNlM4$sMvBMLMj`qWTl>pAsM`^RMW z`iqJDk%K^4LU&T0XTqm~&$U7O+y;xbl89LW% z5&LQYbQs549y*&F1&HzB%Z`Le&Q zNi&!A5UH%50moTEUEcYqzj;`Z~!*w>-NLgDpN zos}tpgp#LqpT6-FnOZh3H1LQTgPl0;68esyGi7~9%sV-V%}kL*75UgQB5yoyqnDBF ze9~JWHwSqE!8F}XpclZ6Fm632#+%*^NT|SiIb*H1^j2Uf)2a?cr!~xK2<2 zlRGB?-avG{GUJ)yu z?YO>fa`A2T{J&*aGb|_Rvb<~_7xz#qihOr_lkoPN;P>bftoZl@U+i(v+v~g1KaiAM z&KYc^wu0NpPa-z!&Mmm@3GuC4H=FhMFG{+mZwCxlILGbG)Mwhf=y{PlU2bdtT?`C< z^R7H^_*JQ0fa}jbF+#o%#v=SLd-SIBl1XSp2M6Q|^sJh}`1JYM+7e3)ADfE;;dR8# zEHMbf?`M8W+yzo+qmO*R_)9&>Jl>842>%X3h&;F_@g8)UxvkuJJ`XjXNCzsf4kwsd zk#{1*(GZ4fn|-Ha?Vi;$TC-vm6~?*OQyan|c2-VAsptsJhX>U^QWPPP5rCLPkh$9{(WEp}n@Q$xzb@)hloxJ)Bgp1#k4v{%*qpwTNTAa9uI}de* zOQ(H%q{yKQNEFPpsZ-4-V40Mze$ZPQo_$PH4!gtFCx3vt^L=xEFY}vVKE-yFfI;Cl zzmU(e#pS-ne9*(&aUB)55hYh`3rRHSFAmWsPTHwcR3D}^y1lx3qa#Xw-m@ttCC<r~PR8t4{knepA zHF+Tc!}JN05oJSLt^;vl>7MUuP27-DEjz~SAn(CaYWd!JZHPLz5!Ygh`B@;L2QGL2 zI3^0p>B>8m6tR4a+kcA%KDB)u?4X_dQpsjjuqU0EuW(zKt!&+u_J@`NhLTY&ZRP^=1OdG=FFx=UaM`8i@3`_mSR2b}Sw4=$ixKmke@7%fMmh^tA6|O|GDV|& zS&>Q|$0*K$s}*;r+CWeNJW&I^IGNn*|N^abDyEg(X(hPLil}y(_Tefy)XM%*_g}n zO0;g_t3%DJo%*3DskRn!VQkj-3ME%RPgeLJa>Uj-?Y?ik>^tFddz(&lxHh#w6Sv` zy_DmiQxE((YAYPdsw=m=?DrXCZt8fttPOid*i`H*)u5`g>?_RbagcCPy<+?#!f`3t z@sJFMt->3==*#7?DC|-C{c)bl#++OH#rpI--ODVEi!Dl8;f6=bF14_7F*aVZrljP^ z3_{t;u{X=d5j=>IJO_2Q@+f|Ue`ws*5A`)M(FeVs#d;GYK@Lp|yD4DK6aDV)&h}$@ zH4dTTXP$<7MjT#0+h_>&y@JMkn|m+1i}5J02H*NUR6Mq6x=7=4Ft)%$dA-m&I&MVa zQD(nQQrNyaP)@^7VBRafI>pt(mwTs1LVIQ>{?=7zk^Dl# zV^xN^6Dhn-N2|i;?X^y;ctw^93jLkcu%Y4MBF)0>qxso-qZvdlAs!QQQ_?!LY4I-` zdioFZh~wkuxMEuRafi$k#-^?9O1JBmjy4ewye$xC18E3=Y(nfD+t}DmSI?3e)cKrC z?KT{k?lw6sbsGtFA6z6*K=MjT;)4Y!9^kmRx(Zx=cRS>p^}jkib%XKlkE$ubybl!Q z5(X5yE{@aAw_K7+eRgVvFMkFJFFf1nz1sggX{(r>N)mBqbh$kL>C-1IqsjAg7{bKD zV&xHKZDT`&Kn%dZqP%w2cPxI2k6va=vMBIo;3~TT-W$1LUt==4)u-c9S5`SNIb7kkJFDtHxj zby90rGgrQ;7ZoIyp-k_*^}WorGxBPg1r6rg3Wo|F3$QtNl2huuY7cc<9pK?A)~`S6 z@x3~}a$km);ttJ=I|v?~@YKwD9=J6h?1qh3WMpJymOt+lzw+Lhsr{)WD=Vx2R11^? z>;h%|iy6l1o_n0Ec}Pq2{)*)Bra>-O+hBQ=<(4CPE2{x%-5g{yB{4Cv>%sKYcos08=;OsH$ z5Uc)=V~}RwE1S|F*t%;y%zg3eM=l%OdOzgqHzkRZfk zyUl8*@60b8RJR_@clqiut(5PVUtP=}OC$|%y4dqjdOY#e=Fwl2HO(1WKRidoq)l(P z($Jt*=?e1mlQtKu4y5?5=Oj2>brsJhaZ?DmuXWW+&3Wxwu@cE=;{)=dB2Nh4@N4-o zz1vVxP}OeBEdkNi)U6u~8ne!|Qnx&P-TQLV)+(MCk@hgL;JMo|YE&m)(+CL;uGkxq zpTlYTWZ7j*o6eDl&SPJysnM;XGy^idsy0>Crd_lkPMYOBE)`X*m1{3j#k6eW{ z_K0++(bKgoqcDMPoaXBlm@ilw2W_>AADIM*;WWv0mCMst{;-ndG%tI1KOil3?OY*$ zBBpJmO48Ka!{aoO!*Vq$S)D<{%WL}0EeA;>fk&Vq)9m~gG_9;LQA81OF~c!2L*wJ) zSyE9stoh|5>kS2VDPkGH`Vt(8@*^W7ndoi#2f!%MWL`P&!?=fOR~N!FdqYv)i&qfF zmTOZOZG&)wh%iw9ej`G~%D?%5NuJZ9&h|XJfOE}>!7GhPt^t)h$z{S6cG1(kbMd`% z=Yvt5{j6@IVY9>BQmaEV+*L-Vd&)&C(1;zQ!g{Pgdi@O#)|&H_O=%O$lM$OB!A=uKOg@$B?Bg1%RrMkz$#>yXM$b5Z7(ir4`^s;Lf#|O4cU)O z560Ngsh7+>eKq(X(vXUWfA z?f+;IN4_vzKD?g4{s6Le3&6oE#8EzY!?r@F#^Gx1yxJB5A8Ra0OzdT8-kRDh@mToA z>AoiiTnZ?|F||6u{(ZG++3fJC`rW4K>1izu^O;6H0m{-AW9vu|x|xgHm2h3`YALtl02RxXCLhHlFX)Lj}(} zZx{Fo1By2%9e0kK(9S8rK+cmLOq2O(pkE8-2_5%p>iYb}8M!*;Xl>9(N50#lA4o_E z#HjN(k(WJ6zOnTt3mvFRbNATewrF&n5VA2E-TdUrqOqY8j{Nl6nJVW0%eFp{j^$VJ z1)5|RBh!8;+43s7n)WtUlde~aoBJzjLB}!%l*k9tcjUn48U%sny@kveVWj2AwmUL1 z;7+WqMEL$dh9NcnyWi{kRDJ0PQni6Y(xk9&|7$BDdDR*4Qa1s}Vk3X{Ke8BRz-wjA zk;L1-_G{4JzYC6REbHv7PjOuuL#ix3gMRWa&nG_kBOi~E&!(W>?kQ;JE7J1t>EnYx zC1Z(Vf9eQ)g$A&TDCr_5fHw#H;#Cg3av1NG(|dsYB#nlYC7x%PLIC3?w)jxyPHO)=5s~e{Ls%Vh!UN4#aJICg7 zig=^89&%afA`;{AgQq@*Ma;-f%IVQs$U~+=>ni-Um0w%yYSA}L36|_U71)`XKm}ev zQO%-fW+X&dwb$*C?)v04OnF|eiOOtTCpWu8W2Ch-%_A?6hJbQMl=n(1$k5Z`xmg$F z(rm}(m%_A&mm;4!Vw>-q(=>W~8;L`+&naIXh@t%Cggn#@@J*Di>z52j0WOC?1z7y3#N`4Sa* z=y18?P!!38eZzVaxw*#5fz$&TRXXG|Y0YpOm*p`{P(fbVasxZEDLRwrV2m8HzW!wO z=V0w(Z7C2P1KMYiQAKko^dRkg3i(mQ`hUnxG@So)hVdZR{E|WJJ9VT>i=v9$@pFUY zh+`pjLpwp=!}P~4$fI~|*4|afSjaAQiM;e*`(ZyS-5HdF%7n1qy* z{$;coWWQJ9)y|4@W3yeN0oOC!VM~qw!1B)Ydcf0r`Hsj|$Nwc*u`IqS%}!SN>O$le zP@aU9Rlf}`&M==w@E7+cDUr`5B=I2?OQf8jSrgESKh<%6d;yRw|7XkbUj87@vTCI6 zh|I~pw7ZuATWz1ZK2eYR9xlj%9bY&6!afnhUnk52LDR&(J@Ix#kc;9pM6&bFtxG1Y zYuI}C`6RETI>Tl97QY>4G2Mf0n#_lrbq)>38T;0or&+T-d=Y>kuWJF&oK(e;qifGB z0p7xQjij7N# zG3&@fY+ z6dT>V&K}tuO%FisJ||Dc_y$5Kis~+LJ~pyBn`(CYQx#^hZ{y+~>F#Vy%#BqIlaIw| zCK3fc;re)EU>Vs58{mJ(UFmy--;skXQO&9tsI9IPIy72t3L3SMYa?6lBFJUH*wc1P0Aw2G#=knf>#p!K!khsho50;&~YGP!Rp=WZ8ra~|x zwd?+{hE^LnvVUPtVjd~-jmHePY~+HioITUf4sektvZP+;;R3orYH*+>x9Bh9c+CD8 z%a-#Oa!Z3+-HgRs(rvzV*VA%*Q9ur)tsW@l!Z_{%bKezT9vcVX&*EhT@&UF{Ao3*p zVtkR>O=ZcRtmU?rV@WF+xV5Te;d=AV%729*)Z=Re01-FcVjLa?;7M zYtZ{y8<*dn!h97?Phl}wUB$F_LlHS;sIu#7A-}6Jv?#$13m!NT|LkITL~UR`!>O~P z?xsJyiU!Qd*9i6ZxZWf?Q~kfrqw8JrfUVy(XuW3YKI8j5^h<%GX`CiD4n55eiyX;v zLm{zwoaUE0u+uEG+)gPFU~fR`aWcIwTQhn8oo|iX=7z1kPhv_|2o`O;&_b-lYqsz6^Ysz5&iiA5aN|Ci{@bk#DzLMfJ^HGsC%)M& z?nQ{$B1nP{MOO3qn>4qIf^8x?3=C3$zX{RMRulfluguOgP)C=b$)DrTA5Ipnyk&+h z2j-%UH2FY+*IAB%lgLDdlgJ$SlOLS3PLI5;XfkgcBQo4q{5)R*_}t#Pt4h9Vw=Pp)8JiO5TmdbUoXU$Jt#qf389u#hZ@3<757*gOA@arAY4i-$be_4SsHKt})kk2|6-pPeX6Q-OkJ z6~L{oZhgbq^1S4JRPqs+K@)g*#0wsx*n#dskMDvx*Ie<2UQd%d{oe+av1(^+G+f`i z9dO_Go?~+8Dk7%&zC?};px%%)%M7TaEDdGD7ju8v<)d@LsfawzeCXfOPg8;=DtqNG zgt+|$U-F$R*hnGQ*9GVM6&+#n8nFFBjobe{4D#=b+Bi%oc~CsE+%DUf3D5ZJFZO~uFv^-QdvK90mJp5*{m-RYynMcz3UX%Iw- z{uVISYEj%@;NZ-s$AT}%4>lG?HsdIu?dSbuxsI!kC*GSq-+6DzQhtf`(E^7t;Q+k``@q?vQ_ zqZ8e!>OS>%Gsyw@cpNRa!6rP-sB($!zXWnbU87y7A3%W#J-bF+HXp}D@cxV7OtAhpPX z2sZisrIu-HK~L!FIa>J_QhN5xFH?Ua+&#P%oNd5xO2Li9VBk=pvD|mrV;x@6m;+&I z>ke(ENxj!jjz8h;miZqQ2-}PFX$9~tdpE$vXqUv-5*J{(`wbf^$KQH4QxE`#xI7+z zD?m~n!>FPb`^+VeQzyZ17u5xJqsS7I`|lVl=g&ZV4U@5>aa8nWxGF-By;h*hII~Hj zocU)*0x$fjI6NL|opN0#K3g8UP#-r&(%)midlTL;)UmcT=;0T~?NZtL7WCT~XeE1kn5$%qyo^_qe zJsXiCbMHc3^QorPXg6ZO2#qpP7*@MD{`M(>7U0;e$H^)MuIP_DG0bg8HH@ymH+0an za2ha9$;b-^b*8KKpCI;xLA+qE1+Y(Ko)m-QI=Eil$4j(Qxl8<%j2AHQ-XDmSWb?A6 zX+cMN{LC&^rmq0(<2z;P1{WuH|#d7T*b%~ zBirvIyX`4N@W&Db0|&p_;YEBlQL$Gq*dmOk}sOlH`bfTcd9j=F5(76zwOD6r*h1KMn2YVB zZAuk-J8JBDUDP2VH(ft6;nYIA6*rRZ+kYNVoBY>E8E+yz(};B8&*5;I_RUQJU;21 z@k{6rV+htd{i2798#njN*!Rx`hec69R1B4zri@hTVO z4sleUG|ksnZ?uNCt5lu%(sm~v-`R~E2n^Fau;96BR6yLYku;5KdMUv8O7Nfx2k zc<8l-P>jUF8_FJ`fbibLVN7qu!t8Yl9B$vS3|_q>O0;mQ+#>WyXK85X= zj|ZPO%Et8SRE7=st&!ybrpa#A98DAOkTelm$dRXR-z_Hr~XIxbyP*lV&JFOWGWR}Ie*19 zQ?Z2lKQJ?q5{a4N4jee1JMR!1&a$*)Ikuy^20dv3nIMfy%cwQd^|<_+EV1{B%__Fp zp_oIwxbTa0`f977wuj2LX6^(F{hFIv{8P55J1(8ls66#~CH9;C{Cx5&wGY#i^dcVY zZdqHi?I=OW?e)ZatIyqZ6L`}28d&ag-8qeBn5vLEj40vM+}Y4=?$EBad?~$Auq?)h zkSvQ~;0CWsj~?V^ea|Gv)zU7D0kqErH8OYulO}O?E0c-f7LJac(|ykmHvk*p@}>7* zY)MTnHAQ}=pcfdHcjFeCdEYs{_-~ugw58{$ucaGECU-uN>geRCpOipcu5(119EU7A zog)rXg`(&NCpc2RT`d0Qy63=}sjr{Y{t}Pi^u#LG?Eyt4!nW{@b-7#^J-2Fm;2K$o z=cO~gUZwZ~QgvAGml@_Cg8OT2uRX#_#`vcxitBL0qPSGGy&bSk&iKZKki$|1Ny^;n ze1)nU{Ywwr?a4>hv-^)Wh`|U{a4*yfID8{BHODAd>16t;`}Ewy{e^h54g<0BSxkEbef zKbOm>Mz?tDPXhBw8Iqfci&_%pdZB6l;}HW_5CeWv-wNP9x*GQA#iQRD88TnrOr%(I z!-J*~spfO_YPw*h@Cym1O8I7p33bI+=_J~~gevgF<*rdkUlLS!=rA3m?l6+iSro3#g#yd)gPgJIPt1qW_BxeORjCp3x) zoM#>|@}0{(3El-je9*F4+kzWMW_8^SCnEB|!=vtVKG8ucI8H2svCT@U^P-jl@SaV4 zJR;Th8iXA?*uNi{mtsRNFA{Asp%7K{g>$iZ{GCbYucRi*V=a6oIe>lxsK5Vl5fBq0 zJ;P6f1o*@2PxC8M)o3nthK{-N-klWb7KU9GN#;hWp?l;3BJ+P2dL$5|z8Pr69_%_a zNeI8#1GXmKGkn^gsx_Pva3X8ETv7tJ36Jwa4Pw{GwY9P55^AU@%x?$ug$l>TMUQf3 z$b_A)@>|W?xqY>6^VE<9$IDWFNdiRCpE-{IpchvX#3&frtf1-HnSx4>$Lgp*Vq_XP zA4v%MdIu0~N0&Q8Dpr%6OUK4;oa?`Jucm*K1rO7iudj=H#Xp(Pnr?295bx@uo^PLR zJ*omsbU+NH)wn7W5zH1(mNLY`k1%8zrVhZW#iW_tR8ta`MxzIvTERnDPvlm4yqaX( zn)vPjlvP=BO6tz5TI3$p{zWDeeiL7e10-g(8SkEi5a_cD)u@jlYe>U`a-UySoq0>I?@;EPC9aO}vb0$)I3 z`YuoBd%9Xe8S~i?S%3vv)j~~_T&EANPE#Cb0{=MyZwf4X_bb66V&%jB<6}@h64}f` z)-HOeM(D}!3>}She+;nN4?D^}bKSEvcjKh`m^{F;zwvw!AReM_d$`C9tvyTYB=^X_ z_Vv}r4RCX?gSG&}O;+t*HKLUTV*N}c?n52;z-2A37~H<`ChYT*U@LI1@~k)1{e#g# z0tf1UBK*w#{K$?_msy^Mhx&=IX3`l~LXsgbgAtC_K} z+HouISFGzyIa@LX2r*8T%GK3Vg&=xvZs+Ny&snXuGW4se5UE?4-Rl>$DO#3`&p_qG zUzpTsSw=rR3pBBo*9X-Ss**>PGdL|7ff$O}0WQOuGoWJU9Yeq~Gs^At&o|*gDZ9!$ z>t<{PAX@W)j8KPS#s)kBRnTN4%bk*A2GiyqB*_}i{>yjI;gbpb2jBZL9pX2v=*K?h zFxwp+&>7%m0W8E;xkiej*X~k0i@v^zTQ6Jw%7kI#oVy8M}LH>8U5y8xnD_uIj=zL4C!JN$CDUr!M5($?KRXD!(Gzs?KilSQrFiX z2JhI~ekm+7(J*g6K-{X$e;#R2lLI-Q?YARenPoY=`}eH3-eUDMX{l9#_wsUkf;TpK z;l=1tliqY`bAO%l@*ePg*US~T9`~H{MEQ8+qtZqZzi9RRt#07ZW9Wub)$a#93uT^K zo~RLD0DSA*13(US)TxBGO@dd&fp7Tu+wdPEs;PC{iL+ zi^n8KyeMs1F&p+ebx;=|t+uAk+zrxRTIhvQDqp$L$`2g1HyZ4yVIf;W@Ou8MummT7)-6BBpB@4aPB(zhzTfuAl5l>e!6>Q(Grp?k4Q=cqkqr>JXo)eeDp`b#Qv6Ix z%CrGD{`iZ2ZN8e}&_4vrzf;9o)aRx-sy6Y(8)STL-k#oXga2@FFZ=#YVE^zpgo`oZ zup0lqu4hwt9|N>Y)jiGFRvjhRoMlVhTC(1l#<52z?jGpd8e10+>>fxKzlbST?ZWq$ zUcrXYmT|9yr-)GZY{j!dhB zJ%?4Id|d{>S?c3dYB%=(gqK-`+?{jL8f<4fqG;|1GDNdg?$xF4Kj^)caI#Y`yYW z@fm7}^dBj{xX1-aZ8ANr#5IRWhI?0v-2u4JsqU^CJk`0hj$|vSuPB=@=?K(_dk8&#Ag!AFx8s3b z#I(IbLuUSdT*CQk!h-ZSv8g#Xn{#-LPC|*m);##=ZdfI|^yHs$#KNnP6ENEozekBzp{ry-;Si~FeTdap=EB^A z@-`DUyrIv6M`hn)-Ui73C+S0$>X1VvE5S~*jfKW?*RQoDX!S!dtcS|{h7~uZ{Uj0c zT=ljT`_)4zukK3=yc!tGL1`*AS?+?zmDnr4NB8a{J)MNy`x$tqbFmF954(*4jz^eY z5l}!Ai`cf`y}Nm3t$q>VT~6AZNOtG{_-?>&oDUW(0N5nn5~=xNrvx&_6vb}i(-c2H zE2TuhrH^!tP)u`w;k`Gl!gt=U^Q0>rI0Hdpkvc52ODp zrvnQcE5Cm$Q_%d+Iyp)lu98{z5g&e_-~k{^bt^fWPPXY&5GzIaW|H`^nW>aizHMJL zwSIx{yMrElim-MOu;%m(`XDVwXLwdsX5?_r}ii%>=B{8~ieLnzk(nM!}6e^{9xjP*XTtpafm9v4 z)f10*(4b+aWzWzqs^_95(OL;IU5)h5fOH>~fBZYTQ*Ziy)soy`pyLwy|E=SSqzmBs zqOn-`i+*~U+!HYqb`jW6=lweV?{{j*L@*u0CJ-;q+;7yuFY|01Uex*NW_7`wRhcJS zp#ao4H2vewVpkNI5C6{2bv1Sw{XuOfKk81;dA(#!s#_!Yd1QRhbAQkfq+3>U-r+?F zgi5Kxo-Z$xBygtxshB9U&<<}le@~$C0_!u_?50j3EM$nI$80{h%T{zp;H&RM@+EjK%66?@$nY&KX*Y7ocv92ELoIFh-Il1 z+3=+BvF(t-0S_Tq0XTft#5qz*H}{v3kNp8jnCiGr7AWR6x_x7l2Fq4iypT&mT*yqc ztzGbh0aXvb3nYxgVHtZh;lr5>{eOjTluIMWSdW$2;jIcA`eU6g1 zWG@Z!Z)*tozWEhd3M69EJ(N|A4CSLWZt5`qvx=uLV&hPj#(%xOTq(EpRXjze0j{Uw zLj2K)_9Tn+7scG{c$#pCQaYvAwD_0fKai{KIB#yU+o`(F( z_QwW?2#_uJR4V-+bL$lwZCh0kf0-bEq&h*9s|_l+an3&22^ZeDWUo&WFJ^eLxrw+Re=Fd#rAr{ux9>U>M5ExRtdKO zA!J$sTtzfZrWH?~I>%+^rW0U;{F(ZoB}3`Ifn9;?9|PhMA;^CW9*S(>TQW3Dp-;G5 zOZX00@y+vS2?k*E0E=2ns6*F7BeoN8-R0MFvlv-mW9_M0Xzzaf!&Cxx)v(Z45>2+i zOZifkCaQriKZAJ*H8bU#hl}b&hP2&UwU3EZ&?I|;*U&%41oX=LCv-()uX9A(OMWm; z5>a2rH$f7?g0;XTje32aCfaQB?AICbUi}@3h!9hvPaSR4$DoQ|B|~&B5~25jskML6 zkHGZzuBR82f8uf{bb>Nf$dvLUugmkDlB-^?vl)9|BNj)Xz%{{g;0XE!#@Mul{(?I7 zpvB1t!2!9Nd_lOs@%U|ZG->b=tA1f@IFxXv*=>+_Bc=}2o}NeQVGqQQB@vpYaf%zE z_*^#>-#pV2OC^36!_wGt*uSNu7cS)Q_q&QW#&+vh z;rXAXa~D_Jvrva=$vM=Y#4&zMm`?e%tTIoIo=BSTOC)`b&nl{zrR}5$%@nM%Dn+18 ziAT$My@)zxIjU=a{)V79hCpFm10np(asq9CAjklsY3ccd7pN>`fn4oZm#2$&!pDRM=sfPe_71Vw=$5^5+? zl^O|6Lhl+lRH>o71A5hazxR9Zeed6V=j@q1Gkfi|_L-Tmpx#V$NKX}izi^oHg+3sU zHvN-)=_5y&_kJtZ%uF^{YHrDE`jo?;Bw_5RyK@Q}mB$TCHsUxL#Q<{?vPCtKxWPxW zg%~$!pV_vN^E`+$Qdt8^2l#=IXR?Yghqw9k`6t&T!LTp0Co@rC%Zf3S} zA5$|j$Wfw@1o(=Bdpt!dyg=yWvTde-NXCqJFFYokUj-7UN+xI)gBs$i(GI6odllmY zmAm3~nQ!Bgw0ClrTuh8|6vSH#z4fk4Gg22~nsU6tE>l1z*3?ZeXLQhfiB64z#NDCW zHt2KkPLnPg>dn@Jaw`ie8W~;voFvIARLq*|d9lm#_4Oq8pnXo|G7-&PsnFswkzcU$UGrsED(i!YpogK3@V)+KqTuyI+*RC4jm?dZHb z&ePanIy`<_!neD6UELktwM$;goJfa((50j@6K-|owV{7! zS^ve67TKfry|4BlE&KQ2=)QS%Y}vy2PY)fRxhTj;VF_TI z*7TcEY{V=LxgH^72To4XRm#!^Cs^)h*3`^6)7MR(^KQG;V0@1}7F&051L3tBd-d)a zY8cG>-h4~%NiIy68L(7aNKo>dtNG?TmK_Xp-u(!fhss@(_td`@ECngKX=OLS<_MA2gBk?Nm{0-D>BK2Fk^h6N_Xn0FG6lZj8t?j^-y_&Y#(?9lPa6ASm%5N@wWQ zI6W(&<+@igvgQc;ujYWM5PM!mJN#3mF4^Fn#JLwdKy*EhGgKGSAA30ato#Rrk+mK3 zR{cmwM$@_4UY70Zp`{xiG(u6rq;3JBNt-M6RrU2hqi^fP;gJ&+FbWU%w&oF`k9N~D z+8>?vcuu^4Z*rPmJEo~C^3}B^?cTCP;o z*^w^nn{lqIm*h1EF}N04Zn@9R+PClk;U5BEVNYe4d2Y7J`{E5hN|N!+P-GDWMXz;y zGV~vn@ZL%iV{dn^WH05I8n2vM$rY0aXo#SxT?TFtxs%dVP_7e;X8d`Q*U-*Gn>aue z1Mx!{d_Hpq=sO9#*4I;b>h(Jy54-a_k{`=o|F>(@#ORA&EZe*Ax`X#Qd`~uq=QJOw z2f6U0H&dw>g_$iJD;vn-3J~*(m#oxmhS{f0_X|{Un24&2sxLMi@8q>bYacyvIz{7_ zZb6v|g%*JuT>M}po~AOfkkl42W3Eqpfz@(<*jJ`=49XRe1wTH1H-rEy{N@k#{d)ZV z)KXm;Cpw>+Dt`an@Yi)X+j`f2@R_kxs$Z=yWXC>0qtX4}7N(>H8NGZGthP%?!9l>| zn=TmV8oohn`eX7b!4S51TccuPYFsgWr&0&W0>-)jEMLNgNc$EpE@k3sUOs(qtj=~j zeiz|Tfa*eKr=eX(cV5auT=wslYm-%08E=1g?t{NK3Xn9mQza5putw7Pw90r6oDol- z-Ru6S0Xay1~Gl0`W%EJ#uhRj#&F8jPWm%B$$I7s&o>&pnR%N2Y2msvpU#^` zoxCgsawvE;SrK5)LV91{p5($SsF~<|FnR?1__{l59VaG&i`C5RoR#H47Wlm zs#8=XxG+lm>P*hxKmdPPBus)(Y?rDnyWzxqV&6*501^<;e!Q-=x^C&<{pw_hzY7x2 z?Zd>LdV|AH2dP4)74U$AZ5Oq_sMEi8YIJQ6l3^t%t4@)ZfBiFL=~^9O|9igll=7&B zK3Y_J>&{MtW)G7sTgXhtdMs+_teooOwT<3s{t{{3vUS)V?S?oz*mwoYPJiqhYNf2q zBHUPzmD%dS$%GABa9mUiMN?^3@3mh;^N>TU#CUEtcDAjzXeLbG_Rm@(WMoAVn4U$T zTv+5TTZv*e_e|TbuVG9tV`>LN+~4dDcD{AuQaa|p@zQU84cGCk^6`Q+Zc5tNQ-w&f{7I}%U{wNJ@jV!#6xkq4}Hl5?IB;BbyByz}02$(dMOM8YnH54#_5g&dTwf3XSr zthBWnHKS2fK9uL1TzRnd%dZb(!8UGHqcw2IzbuJ0VFkYVd-kFMCNKfV8EtY=_pq^; zIr?D$t{_2m*_gm!^q4Y%zz~UY(Md!3lvo{O$tLis*krOd7_+`H3%FmEpV(^dlfHsu zMJQfxKxAf&P<+}N=Ar~sCe16XRt@e{uTAXLmZ$A81O41UI^B6-c)?T!ywcM3Fda&y zXyE&7pD*6JDb;W7TwO*A#Ux8W=bX!lrIa=`!>cY@M81)=7g^G=4XD36ayhr#UWcz{ zAYjx?DlWLi%`IW$>I7D)_p47yMh3x11$SA^CNtT?xXsRVj-T>I?uEO1O?|m-ujTT~ zc)fsTzMg6utLmFi$K;v|N$H!0)z|u&N(U9zUZby_o%$m3h=yS1yDzFU&th`8&I1%GIO#}TfsCwrr#|e|o7`oEc zO`QZM0mrN%Hz==r&RI@wGdC0!6}5?AUoD4VKBAS2Cr0E~hOtq3TSkNcc}GMYY=(5HR4{suQ{-~sJxWIVrFK$K$2 ztL|H!&|V1Jyp5XHi|3*uxO{4ye)hfY@&M!Ebu}W76O}6_DrqQiAxH7jzOv~k&CJEJDsF--bwgs1reyLAG@c!gH+~)nkO;*RYZ%QED(8!kn2pQm*Wx00(c;gi$~K!J%SO!t)^y6j%7Or58OHIL*k!Y??8d$fhr zI%bwCls#I2>v9OXYI!61j2N4o(2RKgTGE4J?BmingBszmv@2B6v%v^9)C+7$8e{$zXZ`vIqXoeID;cl7_-$;KZ!m|!a#wWA(@}JMJRu* z_;{2#H?qAY?UhYw0Re#L4}i*y*XUoqPJc(S5z&4*O8A;~aZsFz+hj07IT4ejri#Ag zskmE*a8X*0Gx-cG5$X!^{Nm%UdqKh2|ID#EG&p3XF>$QgSO%)>G$Ie5+}bz21c<|P zXFc)Y2tKENEgmQnG*P-@R%QU*I*rAegKHg8j|&HZg**4{qByl+(z36ukrA#Y9F z*MjQ$RyQ_-)U@2%`64cjMvr&Y%PNA@;TmQL({TW!5-T=LP>X=-pTbfdj}`}p-!>HP z(oSNLA9fkRHA1|j~yiLdb?|10N_8#kve$?F97G_vD+MsD1 zs&9X&96+o%I)6*??&y5D!7=#Jxjazi>s`}O;_6A)U5J!sdUP@N>kC`!3|;@5E~Y9G zdj*^%k9luosGeBii?Z^mNKrnGP&5TOMi?@+-OglAn3Pbtehw!+@T4t!q`-1xg8sS7 zFWK-STNqQi{To`OFY8~smrh2oP^37g*&-WGHmOThK6^(vgjp+K7}WY<=P5PF(xtl8 zgPo7mL>p-BCweSnQs!`hSu6@V7&Z;65Ue^5gE!<>kSb%jLSyG$aUsfTyHN!<^(ke%-_9J9z+LK z&eyy@{ppJ{jcQ=)L_fR74E1qnJlmpL!TCd!*o?0g0l^~+GH^&ay4IwRFr;32RmwU; zI&NMYna!gT2#u$~QYC7M0JKQJsKdYylzFNTO<2{<18D6;pT|t*+Zksum_W23SI!or zG%Lz*Ni)yTi_+HmQ1fiF2vWLVid*CHiX<)F#P+deH`immI? zC;k!#Xw`5$bPsbC8%k}WS%fYu;HB<=t4h`4IDW%#(;QGg)E(kMHb@heBALmZ=y`2s zYey(G?-W?sL6k<576Bkj)&?^B*iDr~FzDKn_t#An5xme=NWcBLz4no_ou;(r$w z9G0Ta@gj>VvLfpFo@_`+Wx@Z_vCMZ}#&xOU=t1Y#e^eBVhGD0lG?MX@`IrYtI!Nk# zi)hv>B%QJ}afqQYk~A+6WjHfnX06{aPNy5d%%Tsu!dGY_bI*N_8z67we~0f8sByM( z%k;Pr0O@BEVnDT@>Tm4Z@YD~8NcgQs1dG~BZ~bO9%{VPdub}4jbEn0MQBjF2sLRG! zOZD&pI2ATaB9J)0mOc0ST+G4l%EG1#hK%RN(+#GN8*tx|kr7urS5J(c=Uv66WmGcO zduDj4?w}h`;*DUSuw0MsnFlxnj}N@H89Oj5XY)&nXkI7%(f2?#{0I z;|LhzAG``_iqJ)8wO?ah(DvkCblp}0%T$~qrqfNgT5=VOP07O!uBGPm33u(+hVkp!7L$7QX7iku{*aQ**wVLtwIT zy~V(nBJ^-I*n<;!j<*nXvIq$4sBc1`%WnKEXao`;-aTd(-wXg;KH){YjBm(om#&K|cs!IHmtB_A1@gngTTT#GYxV@rx9(3zwk9ye|l zQB~DJizU<(M(T<$&hxXhG>P!upy1zA<^VK#y%m{$_E#4z=|~s zu?`EV26NS%#^c{3J9LtbqEe`CiT{vLy5%N+7e$QfkBTBjNW)VejJ^y_OdwZ$rb(n( zan<`F2Piaki=#=)brQxj#l!XOOZ0vbAa}J-e{h>(lS+0Qa}-zpm4Rd#lL)L&olq~vnl3-eP7HPoSdhU zz0lTcV{P*++)f2G~ZzFY^zbo*Y`=3xT0Ey(p75 zenH{5fUk3CuUGmsU4}WX686|iz4C%=acL%`ZLfvgqr~-HemK)V5Q&s$`cJkL@+pVb z{~zVoh=hOAt=Dh{26|9$8xqw&OoyxX!x!_c4a`o8yB^hFVAQq4-$5{vQ}i6$j8bHM z(f>r3%&!`DZ}u0t+GB_ha|AU#go0aMvPbL_u8Sk(6doVya>$)RWGwXePZGv8d7I2f z*LF1BKD8c5>(2-XoWF`|9OftH_H%q?lK}c7MEf`P{BO+Z@9!i3p)&g)0POJRKR&Mf bKVIGnN%MBJrYslJJG7;(u6G5gW*_!nsuXoZ diff --git a/demo.ss b/demo.ss index b159bb2..1a2004a 100755 --- a/demo.ss +++ b/demo.ss @@ -11,4 +11,4 @@ (ys1 (map cos xs)) (ys2 (map (lambda (x) (/ 1 (+ 0.5 x))) xs)) (ys3 (map (lambda (x) (sin (* 2 x))) xs))) - (displayln (line-plot [xs ys1 ys2 ys3])))) + (displayln (line-plot [xs ys1 ys2 ys3] xlabel: "time")))) diff --git a/uniplot/braille.ss b/uniplot/braille.ss index a095bf5..b73642b 100644 --- a/uniplot/braille.ss +++ b/uniplot/braille.ss @@ -53,8 +53,7 @@ (char-color (indexf (lambda (x) (or (char=? (car x) #\newline) (char>? (car x) #\⠀))) characters colors))) - (if char-color - (str (graphics-style [(cadr char-color)]) - (car char-color) - (graphics-style)) - #\⠀))))) + (match char-color + (#f " ") + ([#\newline col] "\n") + ([c col] (str (graphics-style [col]) c (graphics-style)))))))) diff --git a/uniplot/lineplot.ss b/uniplot/lineplot.ss index 80e0099..a3fc2be 100644 --- a/uniplot/lineplot.ss +++ b/uniplot/lineplot.ss @@ -20,24 +20,37 @@ #t)) canvas) -(def (line-plot lsts (colors +default-colors+) width: (width 160) height: (height 80)) - (canvases->string - (match lsts - ([ys] [(draw-canvas (iota (length ys)) ys - (scale-fn 0 (length ys)) - (scale-fn (apply min ys) (apply max ys)) - width: width height: height)]) - ([xs ys] [(draw-canvas xs ys - (scale-fn (apply min xs) (apply max xs)) - (scale-fn (apply min ys) (apply max ys)) - width: width height: height)]) - ([xs . yss] - (let* ((x-scale-fn (scale-fn (apply min xs) (apply max xs))) - (all-ys (flatten yss)) - (min-ys (apply min all-ys)) - (max-ys (apply max all-ys)) - (y-scale-fn (scale-fn min-ys max-ys))) - (for/collect ((ys yss)) - (draw-canvas xs ys x-scale-fn y-scale-fn - width: width height: height))))) - colors)) +(def (line-plot lsts (colors +default-colors+) + width: (width 160) height: (height 80) borders: (borders #t) + xlabel: (xlabel #f)) + (def canvases + (match lsts + ([ys] [(draw-canvas (iota (length ys)) ys + (scale-fn 0 (length ys)) + (scale-fn (apply min ys) (apply max ys)) + width: width height: height)]) + ([xs ys] [(draw-canvas xs ys + (scale-fn (apply min xs) (apply max xs)) + (scale-fn (apply min ys) (apply max ys)) + width: width height: height)]) + ([xs . yss] + (let* ((x-scale-fn (scale-fn (apply min xs) (apply max xs))) + (all-ys (flatten yss)) + (min-ys (apply min all-ys)) + (max-ys (apply max all-ys)) + (y-scale-fn (scale-fn min-ys max-ys))) + (for/collect ((ys yss)) + (draw-canvas xs ys x-scale-fn y-scale-fn + width: width height: height)))))) + (def canvases-str (canvases->string canvases colors)) + (def hor-size (u8vector-length (vector-ref (car canvases) 0))) + (def plot (if borders + (str + " ┌" (make-string (+ 2 hor-size) #\─) "┐\n │ " + (string-subst canvases-str "\n" " │ \n │ ") + (make-string (+ 1 hor-size) #\ ) + "│\n └" (make-string (+ 2 hor-size) #\─) "┘\n") + canvases-str)) + (if xlabel + (str plot (make-string (quotient hor-size 2) #\ ) xlabel "\n") + plot))