From c9ec3f61057e69802bd8a327a023fac950b3ec76 Mon Sep 17 00:00:00 2001 From: kortschak Date: Tue, 25 Oct 2016 11:28:39 +1030 Subject: [PATCH] plot,plotter: fix time tick location handling --- axis.go | 39 +++++++++++++++++-------- plotter/testdata/timeseries_golden.png | Bin 15318 -> 18125 bytes plotter/timeseries_test.go | 5 +++- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/axis.go b/axis.go index 4eacdd78..f01927d2 100644 --- a/axis.go +++ b/axis.go @@ -462,9 +462,18 @@ func (ts ConstantTicks) Ticks(float64, float64) []Tick { return ts } -// UnixTimeTicks is suitable for axes representing time values. -// UnixTimeTicks expects values in Unix time seconds. -type UnixTimeTicks struct { +// UnixTimeIn returns a time conversion function for the given location. +func UnixTimeIn(loc *time.Location) func(t float64) time.Time { + return func(t float64) time.Time { + return time.Unix(int64(t), 0).In(loc) + } +} + +// UTCUnixTime is the default time conversion for TimeTicks. +var UTCUnixTime = UnixTimeIn(time.UTC) + +// TimeTicks is suitable for axes representing time values. +type TimeTicks struct { // Ticker is used to generate a set of ticks. // If nil, DefaultTicks will be used. Ticker Ticker @@ -472,27 +481,33 @@ type UnixTimeTicks struct { // Format is the textual representation of the time value. // If empty, time.RFC3339 will be used Format string + + // Time takes a float64 value and converts it into a time.Time. + // If nil, UTCUnixTime is used. + Time func(t float64) time.Time } -var _ Ticker = UnixTimeTicks{} +var _ Ticker = TimeTicks{} // Ticks implements plot.Ticker. -func (utt UnixTimeTicks) Ticks(min, max float64) []Tick { - if utt.Ticker == nil { - utt.Ticker = DefaultTicks{} +func (t TimeTicks) Ticks(min, max float64) []Tick { + if t.Ticker == nil { + t.Ticker = DefaultTicks{} + } + if t.Format == "" { + t.Format = time.RFC3339 } - if utt.Format == "" { - utt.Format = time.RFC3339 + if t.Time == nil { + t.Time = UTCUnixTime } - ticks := utt.Ticker.Ticks(min, max) + ticks := t.Ticker.Ticks(min, max) for i := range ticks { tick := &ticks[i] if tick.Label == "" { continue } - t := time.Unix(int64(tick.Value), 0) - tick.Label = t.Format(utt.Format) + tick.Label = t.Time(tick.Value).Format(t.Format) } return ticks } diff --git a/plotter/testdata/timeseries_golden.png b/plotter/testdata/timeseries_golden.png index 02a8d91b8db35e60bbf9fba628cd9af15ffbf516..c4d358f1dd77e2c6472a07da3318742a18f119a7 100644 GIT binary patch literal 18125 zcmZX6by(GH)9qGDx?2QkRJu{R5djqh=}@}6K@cQFq`ON%O1eu_y1PXhB&FjU-uGPR z`p$Ly!v`O?d;jj3nYGre*}*DGve+0D7zhLcTV77;1p;x)9e!@Sa~po=(zx$~K*&VP zONpzxCU2#&6 zV{v=BI!`GD10CJ%XzR7LwKbYR}iLOqWAxhe8R%Ygp zaB6CNd`^S5_c$XM!yTFI%JydKU2dfp6m-FR4-MJFzent@rup1%$$gfTtDH7h zrrzMN+IN1uqu1d2&N)rgCp9kar_ZrLd!V3@(5JhC-;65T9PLVL*KsT-zvW1uzDFlC zlnIvU83ti{1cehv%z`t_r;g}M2gw{PX?2}~#{!p5>>!%6zLwzi(w{gyiVn=Ky| z5*m8C-u;G)94qkS#~%3X8k{|60}e9P2gJ<|PL#W)vH%)_H%P{ay1s?Y?PEq!X8JaW@c)yUSX_6 zwL7vQ=Tg4AV(m{8?PqbcvwQyPmCW@0`}fyULTQ5j{CR_L-CejPj)#qn9T*rmU2P-V z8;C{zdu1hXN={C0WNge{hna~FG4Z+_21??ChG_+AvD~zK)K!@P?*eUZ|=buJlrlsO#zJ!H>(`aa(Lc zLPEyI#y@`iNX`oh4=*Vw;Ns-G<-6GaAucAS0oJP1y{SRtqrm8 zJ(%!IZ-v?L!1OE1_kn>5a&ne)4dmN>$%5tIz75UHc>erEwK-Pw*l}$DuE6o%*@v`# zJ`~MvrM0cLSw%&?hGoUtwL?GRX@!Img$-bzcj3a!HneV4^P=|a%iqzfw5h{l8%p2o z$cXC0hYt}PJUptZs+RTaq{F$-EKE(s2<0s^v$FD43qnG=Afm%Qe%wDenD(KLXG7!T zpZx$A1D9F^AqJuB<|ar$fc*UB%XY&ua|??>LvF;#=xD}~rC?}B=Adax!e3qrv)wnn~O+MG&^7828m2(Yl<=&TP%~xj+>FAc)0x%;YA}q#>FIU|N@F8tX zHn<(cJXH7d^LrvJ92yd$@rWcvDR0me3l+&pmQV(Q5J5yl6w9t>ZD!`S^dl@iJ>BE@ z@95ZAZeHHbL>V0<8zG^(^mIhZ-Gd_k#*lhkd6w6%|<-8}sS6_$pn{aQfX&qQpWS zmf!uyC7n0i-Q68gB4up6a&>tQ>2P{tg4y*SWb)&8C4*s&jb17$pQECpl9Ojz-XV#4 zUzi#iW)>HF!z-1Z6Zp3}qMcC8e(wAONi#n`|McW!WMl*x1*OsbpMs*|*UD@(GAz_~ zOg(S@#Kc5uQSUcg38d`0+Lh*`CwohSb*M24YAPyt4UuG6xtO05&~4`ZDtHvra18Z+ zfBQM!t!iMf2+JVHlF`x8k&y5!F1CiMFjMQmLexcS7S^iY#6m%7u&QM1c;TY1M%>Vl zE~uKLvs-_&ETr4F;V#WJ`&{SdGP=09sHu$#I;>P^*~2&?qi6u=5a&AUjsm!nES}!ZU#q z7dISoGuCA^&c#k|Pmkrfd~a9R17_w00vRbO8fs5C$i+XBR|WzzxMxMN(-fBNgi^Hk zZ#{OdI8KItj*lM!*)&=C^mH|C+JjRUu3in~cc^E}fBsaAdzfVdGyJW2jL3S0(Uz1?U26?Pnd*=8ycnCPERRyCA;4Jbb*oPCMj#kX5bM<*&u} z+r5_0l|4kPURWi*LMRsMe0Fv=6i(fG=P=d=yQLqQ(xIwqYPA#q3Q|oSURzIodz;osTcANh z0~L_ACJHm9tE&rg-&~^yrWXD!T3TAaNPZXG_!dvB@aw zP+Jg~rJrx-o9sR!fFE0@#W>^(UFn9l*gp__;#oJZ{L~c=I6hD@xm_|-NM2G z6B841)iXuKZ{NOseo2nV&dJFbae&m3Xu`aBViy$T+ocfCkL!I!e)bQ^7u9qZfs1Av z^x?#SV+%w3HTpvjv2KPJD0kBSeNlM&barOuCUqMc+QXtsOG|Teb8+$=JKk^sidtG) z8nm{z-^UfbP|?=znKV8-TsLJ2!M6ALnxDUTEdk}3Dswk3A~Es7_d=K35Z6Q)(i56@ zVk;_m34gNq=tB9kCF08NQzg{~m52r9sJrcZj`DDP3Fu^8EN(!HATMEIv880ni0x7X~IKEiJ9W{CudI{uayAKYj#Sq^fCZo^4H*10>VS zN1zUSl~#XPNglY4NTDj59+++H$C=n8ycnT;|0JT{MoJ(+!tHdQK_NZ-4hDw%$!-RX z)24nbtJaUo7jp>>Ugsnwie8%y9>>K`OBBh;#2lzpl_*Atr9u@t#FNtq@0_8YQp^ID z3M1#vHQ~0r->3Gm)sbb50C~q$uOJae5g(5@L}q5U67TQkriGEwOI_X6?sq9EDGQ_R z`W$KRZeg+SCL%{^hYf29JaOX+a>h1l&#N6A98BOa@LS7MaOhhCI?$Jgtl<4luR_d1 z@R2$KWtJP)xBF5}>2EWUr;hKdUhL40f-_NWlfG;fX0G~dNA zn(792ztWFEd9A$A$+MjEIsOh*>rC2TU2TyJc;x7snr*L+L^V_D-L9{M$Fm1BBtHna zynXZL(>>t_aK zeE9G|U$sr2W9E%y6_P-W?^D(hO}`u@fsgMv+g=sSR+wA!@bK_i&wTm%bw<-4J_JMY zAyf}sWW4^xTHy&aF)`}3af;wELD*2DK#)+!fL}EoXegk_BQ~#YQ>Fa^37bpAmKmuOoD&CKf zGXng^p)cm@dIC`8?_6WO>z-k&#mVx3DNkRtrl$~(AxFxsFjRE(&nei9jOkhJZuBTG zirdt1ckymTjFz6^KjHGVesL>+-C=2YnHR7(B&1RX;9gKpwtlY|4`xay*L!<=w+*BC zFVft<70VWYOMNw)B24M&N%q39X~6>b2p^A=4D}kdxyVn=o~9)mGX)p&9%RcKFiL=p z9R?WddA=&#b3YnjH1*ZTLa4(As_N|{`C>U&Onb-5T1KW<=>=pVtL+ywcM?&D-{)tv zEOhtU{P;-Dz`&p_0XdncIVvrUnuv&=>>o$G_0Qg@6Z1YPUo>t7+x7#GF|Nqklm!BSj2Jb;$NLPH(Q0}G=S zUcDL%z$Cp5kf{2FZnz>Npu&^WgVmbo+qu(G$nxq7Axy3z{wEX~<-}DR?bqEHth!jk zx$p9r229fnF%MQ+UAU%OlmiEYf`S0E+A2V~0uU;|@a)+$pcoI?*=^2Mu~3cL1F^O9 zgC3(L7iy$0XmTG26%kvnqjtAfWz*4 z0@JZhlc`h(WH&xu9h(3}es*pyRU!l73*|32cLfrvUbFYCxR4QtPN>Qq9gL^vlGl{B zOH3y$r1sC*0W($##!Jlf7GmvAu`3ksK?Jrz;h6NIOM!rZ zz)43aDa2T3XD8&k2K(iZh=}JFVF0E|<;_YsBbnJl|XEF7G6xyPEJm`x^shBvZw0zl!-B;tp(IPS8?t${&>w$Y&rbn=XWFSwvSSuE6}$OzMtCv z=C+`lC-F;tuu|Pe^!rx?U7m8`#adioa-$2*H?+JJH^!zcO z92lTsV93eL+}{{2#HW+7r2+svG&*XJd6^h!6*aY}*-&;t!2{rpj`z*heYlwb zmI3xpEBA18ujxJ-4c=s;um}yuAEGh$9xQ zW8K)F&P-xrZToiD&s02aZ%4a=D}rf}^&If$@lH=qFB3yAssf{YdF@O|@(7Q5unnNk~G1FQ=D*DHV-+N5sZ9*)0V|MG-!BUL47P$)uEQ`uv=aNURDK zq1)^&Y&FG$2nq?I5VX&(sW}mijg&H+ra-Jsmaj&$ycDPhx@>*wH}J7}t@ z!y@nW;pOYs@_ECc3I!C&{iNBy5G*OWg}7EfC;Bk;u7Jal;0eepR-!q2;QY$v*0WPH6wHT^XJc1%Fh_11PiU}>grNOeVQ82U=6*KlWxG8q2?g@e*B2V zlNS{eBb}iFdILOmkR}8?1qFru(ejkn(bl91`v=r#eqz96ZJBm3f@ zVydmJUHTdB1K=St9N;e(7eO9!ha*udUIQ74#k(=8nuDw}oH3Taio`;tgID3{|ERd@- z5wGZ&7;bKEP;&rt!4J>rNk#KI^fj|c%y-&!&}>~XZJ64maCbG3L%)mPb-r~-jUoF9 z5pY}By=AVkV>tI8QB~DEk5!m8TsA`^BdsUz2?DE(gCYOAqKSY`+Q169d}noad}4wO zwvUi-cxw%>I4372DG9i|>+kQuvf=k?;iv^2e)RPzNk~X2DfM-Bn$6ZZ0f>j))_Y>u zrjJ;lYM4fy<`FZZ-lD`^ilSk;+ZNY0=TYC^*{`o=);K+f#@391 zT>$~0;IoVm{K2Ff=_qsw>DJu5h@@U#PVQv8dj75`tCF_5x`~xl@8}Eo_4MgOF0Os* z?(yV4!;6zW5C%0hH31*H*xB8W>V)&Q82f7AQdU~3QDORAK_Mh2hWOr;eiMR`gSy?w zqZIcY9@T&#&d>2SO=%UPD&5(%s-E7@_azmdJv%?zE-Wb#%^}AKARr?n!^gkR!qS;4 zxtLQ?ahR9p4RmywC@>&kuj-GJG_X?H%}II!`9|_N-OS9)1|=b~9ut-i`;@lr=*bxA z`XoK>sQt#Rj|dj1i~2IH*u{iWtW8XQ{u|#Lr;Xw{E+g%#% zI^cRB2;uCd~aa1ThYbiBzanHMOw+mq!#=jOaezC6#! z$S5c%kPO6Hv=qxw0TMTCI8V-Pd_!iRJn@7V0K9^v&dJI7P`#MQ_bPse6qO^DIe?Ae z7D4E$#zSRBnHs?NKyHC5e#-p-k}0swxY}AcrwBS(&8>$3-VRotxwssIZb(c@s+=M; z+SL^@tXASM(d^@cB8zitj%zjECYpfR?sgufZI)c-+NAQOiIA5js=6XpX}w!qcG00G z+-Xp5pEY}5!j`%pu4NRQ$w!7C@66}rdO#UnN#ENhgOo6AR#^n!zfVWX5&pG3sOyp8LU`m?%v;Bc#|sMdbD3krRc()7`N zcJ}_-P(ON(d0Om&g8i){hgkyBHes?z19r7BOKhCVdLDDg8o z`JmG-int9~33sdP7A3DK?*p=fXDvGl2Il4kadB~gtuYkh0a!;eJgs4T`-&IoMzYtf zwx$~I?uMU)R2>wLvoQ*++qXAug$cRx+Ei_JbrG1*8=G)95JEKd01?&v_C_9>CnkN# z!6a4TRFB6dCVnNU+;06h6)-S3cxrCNIh*iCt_sb=#g-Ih@W0Fofn@M7U|kMWLqJ2C zmFC2&-}qw`ppLTU)n*KuY8QKH&j9>Lqx~Ik{nUsqSqKFme|L|rCjn`?O59-<6P3fW zb^P8I9gQIemI&^udg}wh&xBQV@t;1hI}j2RS6WVTDFu6SCx_0w;hKcJ5f=69*DrmC zgG-5=whA*m>gyeA^9QbOF&En&Mb$gcYF=aH92j`xAwTmslNckUlRMF*)U9(|hpHN{ z$fy+=7YEhh7q1I2LA7}yG@QG55E3@XXdkXEv1yrBOQ^E$whmH!Ex$ia>RDE_ezeP5 zNB+ds7WANoh70I54bET(NbDUSuUZb5=rw~(RsB2{2aVHn+|_lrYbCIg1n)F5yGnu5 zu#WJ;y(!@R`zJnEo8~0ZIX^k^Oeu)Bi4Tlb40)sG zPmjbd=q0;bkH^Ny$d{imM)3!7tov`<7iwyipqd<61f2#N-0H@?*lP8TFz7O#%e-gw z(|IW*noL*dkp#2{#g&z9CQ1#8c<4e)?gbY6D$)@=PTKzz}QU8KC^4#VCger09l zaHTvD5&uqC<8}n;*4l%DgVrGi(58}8>peb3@Ml-zVt2nhvY^-g|41gd?x4Qo5}T0{ z@FYtWK@p--e75*Ueqfxm>RY^0PJ7R@X5%T-7GjRz-Q(l_-d?ZEGhYAJ1)=YTWgu63 zuk?^3G$30*D+yW(my7Lak000n{%uGQ%;T`42yLc^4+}rlq4bOo$eABT9PJ^(nS;0x z{+PD!roCid68@bf%nczkXpgG}foOSiyaYJErT#!{oCyF0P0gvVugkf(xv#IzZHlu% znMmq-*>{8I5VpX1NO%Ydp{hwvLu1k2&Q8$l%u!MCV_+a^fpK0|7F@~>KK}Lfb?s9Z zXh=~|Qcl)yy~(xuoRH9IaU%2{#M8eNk-Cp`xANE4XNQv>$nX|&)@#{~e>M&>KgZOn z#K}!hub;&yO=}c4Gc#jlEn*iD)mzDJXm|p8ZTHxKX$3G5TZOw+R5mj;dyq;%xdU|I zaOvVD-tp8q4oW8xBQPWA1yK?aWqhTfUUvE8HQi*PtcH_=S2Iy;QOL%yk z-+Y<^NZ7T|5hVzwXJb=hjH;z=>rZ)n{PqDf2M7E6afuh9WF&K&d;&e}>({S=filNR z8l!I)zb=a6{Fn`>C((bdt~cIdiC1MF&jzZ(3h=*hYEft{tPtH`#{^2KN<3b}hN%P3 zlK8ydd4nPj%|=MwY+a$A(944T$nGpN`dMW?yRouzgp$`$AuWkS&m?KhMn>75rxr8c zT5n<7i#p%l% zy26Z5^d*xvY&7U70Jpx$a)M~r{sC8Z8l>mc)YNTZrWNk&oOb~zpdIdjB)72L8%&s1} z7L>Mk@7_T#G_CQKlhZ!{C!nSU`Sn3av(nK;B_)NL-|9~mj7qT)U}Qw?0ug_B+Gdi`_G88yk_GZ$w3#fksn_dfyFW zhrY(I(XUliki0ei(=0LsJqPF|2rr@@M_++p-LRm;^_RL1grLTL{+ynf3BBjo=;$|A zRw)q?cF+q(!6X6UxzX()@SyP#9i0)}4M0TD`D2KXLl)nfsw|`vLGHP>bGrOK#*=kz zvXS`hS)r;6F0y!UmQfSw9T8|XKUY<~E9AJgHkc(TA@O-&XehGqHMG@%x>8b7zJ3%7 zJ<{y#KlLs<0~tWS)`#;B99aE8xMxgbokl5XOOc1dhF8+Z?s0^NV7)j!^{TRvmPQGX zSSMl)kkQmkELFpMS%{9Y25eL(bCHPL`s5{rYuh zSJ%e%yj2BIfD88bF6!6OY)be3G^zw!oN6TDB$HvK?fwhb(bMZ!6Aed~X$a}yfNu&{9f@lC+`Gr07UFT%2@QUG z)ild_MbvCMXf$6nw@ph1`i5dw%u5scFM@PQ2htK)88$X3h=`=J22pYES;8&Lr0)Gl z&Mn}AhDFvg7aI|=ekXvFN{k|V(!Y_irp&kU_A6JvRoj#CM#M`0haN>+mk)J914Fkl zF702i6ba$;L3sBjxCsn3&MfgGs^-smU|ikr^SCqB$zHbyk+X!Y8Vo zW?^m_D{6a=KU`!cE9DC0sobO=$gpvL>a5|{6;Lta*mR~eUChkZ+0_URDx<{{xCQh+ zYzC+ZU>X}7lYdlM7@z4$7UZU(5mQo9($sXHZ}I}_!>-#fu=-0K^ykBAMLk0^vtT}e z^zKJn`PtcrPKib*v;?$NEsM%0D9@ev#KdcQ-hz}CX z7ueqIRj71Q&;)woec=lAU`x?!V`Jm7^A1Yrns=-@Yq;{qt{ z>+6GT0gu0Sw?7ebiG7_&+}=sI_cT3yORdA_SX8gGmPFoCLllBliDD#ynZRk)bWPt5 z;u@}dKQOh_u~1KV`DJ8eGBan$4?O;DbQqQiFhEI}o143lqj*d|gVd|Z4NC%rI0txa zOpL=y&))vNMA>YLFQ_T2Y@(;uP2>#?`v1(+hp#8S&q;Kf-hceqqQ^Mlf646%s@!A! zpQsb*I2&!Ri2P5(U-dpSGh&y!N<(fsco3b)!T-V~v(*|xUZE4_rD z?8&fvb}PAnz{Vyfx`R;zs9x0oC~lua3=p;buD(BcYhn@TbOzaU0&E|ahiI@xkxa4t z>14s`0EBd$?c~(N;9+R1Cn^BvFq!E(r^2u>?7UJdYQrA&{aYg1{uV9^N>n44cSLmq z3TOUulaO3r7;wzvcs42~{Kw70W*{RIsIPifeBXB$?Rt{Kg9hsmb*HhEpL&0%Rd}o5 z!#e8j=8B1lNwxK?P+w*=01ix2Hll3nc~UhMCrazbenup3o(1Ilw537Qgt?*yHK5fq z3R=U~vvtcmJ0JtngYT#6b9WBeK?l9$H{pqT|N1*YU;Wg=7Y6ZKmd`k5@tS&ip?L~5 z=yJ29*&bt0m9v?MRMP&NrT8tZdp!vS1?Y(lt<$&eUIjLzwJ#jlrq&0Fq7FAMSo}4H z!)jouMAmtfpvYLwoTtJJW)df-d5K;b5=^CJ;JNXfS=VR(2CCV4#;>yx%Vc+lk$Xo= zHL*whXqd5ws#-`aEjVT=n`HQnetdL0T#En#lQ%FuJv}fTKJ?-P?S$?$A3CzQ~jv*1%a&@M$a({AU7x}AVY#) zkSu|Qh9=HTPfNSM6fWB2{;!}T3zCJA4fHtQnwXTkIM~}m45%;p6Cx0vH{6RZsQw4MYPy^J|7%Zic<;2C`-ITol7d8F>Cax~v z-M}F%4v83g#_)C%1Ufpi5Xe=70coE6NNCQAI+`Sij& zsrPb4ulxE>Y0w?Zc{ZM94zi3kfZ0IqO--3iQdLMo8NPEleQD?c`QUwySSY>3Z?&2Y z^wi%pO{im*?^yl&%v+{U@hHx0FzxIFyeJeE-+yIBrK1N53DSV}3Mv9DZ|odJQ@;T# z+~o70V>HL)9;M-a%t#zH2+~*W=C4iJOdg>D9am11P*5wh{2kW8b3 z2!o82^rvB&kO|cpuz!Hrq-@$X&^81;2pmr;Ra911AfcGJ_}ylexYgxU^B1dcS*7U? zNr3nSy(!C5PlFqWjqc=hwfV%Dev=J68RQ3TB^Q8+Kz1C38rwrh!7K;DVW>n#Pdw*R z^}IJFSc0Id1=7Ylh46YGxMJATSsmyY7>KE<`vu>F*$lEwaCmqcr_qlht!g1@$ySGJ zkrGSiQlfwac7_LZP*LLlq6gCijeUxVjfLiCnG5u-Dh%3DDZ-o~%g=RW6)Q_igX#7K zCK{unZ}asENl1{`GwfYehATtR3y)K;X%p9nPQ{uMt*;p{&QPb_1tzKj6>>DSwAeK( zOcz?-*~~SZl2~EyPnw;!{EA?`6ZTPPVC;hXOJeutT-A!l2?2_iKj_qWa5S*Z zxhl*|%BeHeHhTOC_g1pM5ujrG4Gmq>6A<80V%GEsq7G+N{BszYn5Y3Ep5q88;HphZZ&2E~O>n(=jwj6hOV{lQ2b<8%^!hpYbccbyOdsI|ZL_hSXrW@LP&qC#_j&|Yz%$?F_Bml*uZffc-JJvfG@5l|+aTHm;XKdpQJG=>EW z{tmCMHVYa4E9B@qAQQcLO8<%yX`P*FFQ$4iyzOIpe7| z+?R8Up5EpRHZpM|GqcIYk`v%C{QT8@4ZnYcQ9`%)@j=Mb*hlL<-C!<-4o4Mti7Tk< z(a}V$Db)S5;KWe+KW;yL2me-mA#_XYI#y66@vAWW-mVYj_8!|v1YTC61ee%?{*X2{09uE`Wz|9eEhJfQ7tR~|GNgI z3fM_Z2sz#dZ)kg48(5l&5)Hb6Kczi!%go8?Sl5h9OM^0N0oAMOy+V$N+dk+4axY(& zSNcstcN9P)z}VzAz>z~kFW$ag9wUN{>V{_GmYTZy@zx|alnUpV=hmjCLD1{M#?E<> z4|OD2p~?HQE;m<3O)aMU60j&>Yw%c3MuPQtU|@jniOLt%jf2&Gkk5jYQd3f>h=`(p z0KdIuat?I*#%s#M6RnhYygvNl&@8_M=pC5X`*2Uofljm0)6)ac1iA{6lck%qw6wl{ zdTQ#uRR&N}uFp2vSy@>tlE52`hxZxa{Fg5iKr+VI@X5%S0R=0pPvqfB+2#W|n!N zuC9K5dRo?u2|%eYJg7HLc-m1&n2YNhgrQ|8cvryrJ_r)`VcEi9FH^FJS0YUiwfD&) zXzbv)mRnn0H8C>E`uerOe6#>C!2Lx)Cg3Q1mh&R+(d)>hBuoStLBTY;32iCZ`*d-C zV7KF)g#`s*Lyn7#ylLZtAq;+H`Bdq7pLYEE#r)(+gLDk+1iMb%n>TO1H}N29>g#u= zDxb>Bo53Z8UeU$8zPb4Zc#&noD4?@dn3W~T7!|=ODapw}7H|Q%|J%sP$S5=H2!S)A&1h`AgukSv zqboNZ%se@9r3WQ^5iI@!YC_Nh0r?*8OAWLYAWt2nKH=te04wk#lFf_LgRQg;Fwn!q z10gb}^OlB>kI$U$jhqZFVz_$XaE3Tq&4`aD12S=O;dx~<@bf1V8(ZJ6Uw2+BA9^)< zosV^ODL}XUPiNGYd(;~)H)yfK&O`4)A`*N^U^#HTN+Wq{Q@v*i?sKs4m1;bi)18}} zBV<$*a9F|8vWHYb_1GCM535#H&*UVz?Y;_|Zj)y)UsrcGWaDq;<>-DKTwLJgrN2YV z$!Q0UI%ILMdatjorN=_=oVk4oEGpiR zIl}21_rx!5ZOvpVK$i$qDG(Bhx zaaRwItgRf-QCZp9Wn~*18+Ej`YwAGa0lJjFEg!|G)8v`pwFdVWc8Uk8^fjtr^Y?{? z1z>Z$e0*GFSb~DJ;2!p)(bm=mbf%0a1po@fNIwq>mXB|KUG##l~HG;@{DO#sW|hygf8`{1h3FH%2j;aF+v9bfr{Pqg(YM!w;?>LI9+j7?0V}8v61D?1QfEr}scj z;kj3?QQ={`+0^7{BOrZhzElLMTuJFuxedGw5>rj09kgDhX(I;YQfKu+Ph4Y&pt%FJ zi}>Ly+kX^rOF&$XQ()$F1$;{SX4}9gn4TcNsYzE=m4|^r8qyi)&o4Paf-4>u>dPis zD|&a_8+1@UG%_MZEwV}s1);XCRO2he+{jaygaK*%+cyF#A;6*#%32=$W?_JsO6Qj* z)ZaXmp^X4LK$wgzc$6%PFsv;qPB?ybcS8>;%Y%iLRqe%#-y0C}c_k(NEFhW{6cvG8 zRZ3aM$%!{X@yAN;TL^H_QUq-mT3`$16clKuGhi^};X_JlYHC74e-T;4z}T3KUMGYD z#EyEgwxHG2jnaB!sM$j}6fyg9}#H!XoSxlxoV5fQVzeke$x+KqsK&3H7ykAM)9kjR9n_$BA&;Xw)f z>AJevx2;WrhsWC798UiC!TSEcf3wX#%`ou+Kn@zCJKG1TCNM$**JEuGY$69R@F7w- z4KCV&5c@|M2qk z1S+(!v7wNm0+baYCMA`<9sUp`IaO6hNSUTxwV9c>5um6jGm;cq(6=1$Clj$2r$fPxAQD$Kw zRH-a5nL?;0rnIaCf(7J8FB1|J%!oJwhZF2Qye&+c!0!Mp;ACO00bZbTzO`iuy>|rU z=o>nTm9+QoUn5Ldz~loYiJ(L`S648t(LVNbuRJ2e$HRklg`j?cxvNzxeN)r;v@~Tr zhCjSGX{NC%AEH-&=G{sA8h#gTZBQ&70Ox|Sw|QSd5gYhQqU!?ey0 zaxNspKTnjQBRW~~4z5WGn0(!tVKI}`-Qb-85#kf$I^^X#@b4jh_4Z2hz5xZ2fRK=d zD8%2t9el_q&8;xSb0dR;$8asDePH0Tuu4~7AGmKg&fmT#ML|JXG6vHl6q?tXnjuXV z^75T9V)HypCZhAr;VftdC0f-u|1fZHjv%ES9m!m$L5}pfzT`)Mk7$2?xf|>xL>M`M zI-p1rVRV4a1xP6r*lQ3V27Iod(eSmXXqvgRA0@P73jXx%ZTCul8ZH8iqY(deQJrfU zy?uSwcBx5(kY=7f?S`bzu2JfH=>+o%kjv~vz?S`EZBhivGG#xXhuHVd@5TeyBam01 z(Gk+y%LJyLZDU5rJH`hF@UUejb~@py z!P*a<#%mCsCYY$fuK@Z_y}AX;khgg*HpBVhI^Zhp7cXGICN(Lk`??0*Ztu4=3Q7Ph z!TtdWko#Ab5QVJHQpTTVu`at$&(6M4rn`YzN)xnxXQb~C1D>9q165#!Tm9)bmn0K@ zuhDdnmL8m?IyJTiP<1qGO}G+Flav9|_Q7=H<{0bI%rJC#0W;j#?XPTl2eRb#z-3s` ztyP>#pnZr45VS3=MGPQHkx;SpOH$c@27+S~$`H&e4821_ z15q4|i2=C-U<-nH5H%n9GBGhR?{iIcBd_diY}{0bi;Ii6UfYxz7*+cDa~1A1n4%#m zY>_fRxy>7fDUE?^q>@)4cz`2Rc7q$ES9d_vQ@)GoA*k9n9(9-=xF+Ms9Xac6Ypriu^fT|9rG(sk&_@pE>WaMNa zr;yD*U}uI#0stx))C3R3&9qL$On-m>z(8pw`5r_h_{XE;;^6h^dlxW;7k*dJ?-O7K zFns-;Z%*r{%zlv%QhgfWNdUT^-@q+_zXh37)N$=|PR=s;E8Up6D=5F?|a)*a6v@!x9s z^~)66oM5V{EH9^o2q-Mvgg2eE;RiZ`ES?_oh#)u`K2BA&!gjH3ZEX#B*f%sTOM$d) z=ys5#ZIgJhgJJ)*M>d+kW5mS70BXZ6(Moa=qw{oT82kQR>S!nu9L_m84CBqquy=!z zg616X#^85A5|ft?PD`7IWlzW8vJ{ga6@x|xublGU|053|e=ziZBA23^oY*v!`R+J& z*(-er$^Xi(MYW`v#5vH?FTY;)^Y@3`*|jY8ixH-Lh6CWtMAlGl?Ewe{(UZrg2NzP_ znp$)(@Pk1f)&xZybo8=s-y|55fakjI`flHYIR_s1LsO7#;j;g?hX_{Lx{l7rj8Ufx ztw<0i(OfVb>2L~-;ECNUOStAYoCo~=4SmUAIR-%;%+;1jzP`TThCPA{&ZbFW!~y;E zdvM~0%A(D#dw#+sKpJ&w?cYKzgn33V`GVIDTrBlzIqLjcv2R{}Sq z3Y>=T!^8XGv=0CMTkTH^@ALofAo#Atf4KkuCH;Ds;&_&_8cG_y6=Q`RY!@ENjv@`4 zj1A%jmUsNV6cqd>0BdNa#k>3iv!zc{zMERsmX;Ua4jgZ@vUyjYFw?@UrcGRlo5Eh# zh&uSRof)G*(d>tiW_TJ~8fOpD2T9ohs@IKG*a`5On3Gc_TqtkvD+tawaC`kGfVA;G z^#rWfj`>r;AbA5VhtX*ek)Vaf%+#X-s3bx)?C;WYVf{vU+qf)DgYKngfD>7KQ?|e5pp+Xhq0lFS_dWs%`r3= z9sq0wNDDQPBJ9XU#c({muI>!#GITnU%co%Hpmj$9z8Sbf{(gQnhOc00w~>&{coJ)C z1?{K4l$2CgS6@%`KvcO(iizM}zcV1y1$q4gAIJkRqwrIoLuKL*6dBNNpX-}g==@$< zg3to2p>jvh)|LaqFj>^cdv)%+3D|q=ot+^TjGqEQf!s?I1UxzeH?O8fLqVYc65H@jmKqSBL0tdpYW~RYKYrBJ*7EYc)X{15Jl!XG z+~m5K3DtRPqC+~Aq%4bCSXlV+)60Hf=ted+K7W2iK;yeS0H!UW+qSmn0U@NLLuC>N zn+CU+F{)Fa1H8p;?d{K9Hxjr_RMJbpcu#8T*Zb_J3XF_hG))jds;ataY`}p?47OW> z-ZKyabsfqwj8I78w=+9eJ&gcqj*lP4gq4)QSA@Ea1E56uxhyE50ReVS7kfXc!PVEn z0`_gtTny2eU8p{Wg-x!Yl2cT8LERh9Ou80OO!UJ-E(-mJ~eEgVFunK(# zN5miWuDn`u;IUvX=o?)DAPPr|EUsPeY}K2{D+g8x86sp+r;QN^bJ`53WUIq{Os;=( zja(r~0kG7idK3%TA(Hel;{vL2ox2K*RS_>ir9%Jlqw*RfDH7ja2Y5oSmdOd zAO4!Z1{G(E4J2i#pXr095c{At>dZHTIOX)~^L+rZ;0fLmtb{2S+Etsr8e5_-o#f+J z9h^UIo>~AHJxDiNkKro;;Db7sNnOBt3Ar5bJwUfA<@B1Gn?5qYhh|0K$Of za4vv*fTP2u|D~63;Ijo440Jj$cE2@IPgh}vqy&{6N=V-Dy0&+<4k0w;VJfgf7?uiC z`-codj~~O(#phwWvM*nPq-dpOWq|;IV7v|^5Iz?tWxGVzSe2EPst=h&e4@k7+4;umW^)%_rReBbVa5%H6Tm|d0_42r(4Hd>@fFvj zzP=wP0T2ismLxk3jd1PmX=rUOV*Qof^Rm3JaQ3s-^(WKBj3+VN5*YRV92bXc6?kdb zj}p}hMTzFD0E|u;2pAWa&>6VSfE0Jr@%A_fL~-V2(`))@y#W=Mk&%)4&W%jNEFAFR z1DZ$tC1~K$neS4rGvEt7z+rV`blafvyeE|McYVDx!J{-g`-ZkT3VDInmVfe2;?${Gsj8beF+ILsK7{14+HQ(t~NF|VbJqs z{s=lDBj_Psa4&(wEgw2hH+t}Eo*wP*hrqC{kkbb6(*Q?)RtK1>1LF)&2q%mkLJcf0 zFZ}XFpDTeoNxT<_O6Wa_w!gnW>~l$O?kgA|Eh({i`!**%-4-4P_!q=eg-{>)dlpCF zdSMup@P!p1_<`XMTth<4%s~14 literal 15318 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≠wC;N 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 diff --git a/plotter/timeseries_test.go b/plotter/timeseries_test.go index 568b1584..696b15c5 100644 --- a/plotter/timeseries_test.go +++ b/plotter/timeseries_test.go @@ -20,6 +20,9 @@ import ( func Example_timeSeries() { rnd := rand.New(rand.NewSource(1)) + // xticks defines how we convert and display time.Time values. + xticks := plot.TimeTicks{Format: "2006-01-02\n15:04"} + // randomPoints returns some random x, y points // with some interesting kind of trend. randomPoints := func(n int) XYs { @@ -48,7 +51,7 @@ func Example_timeSeries() { log.Panic(err) } p.Title.Text = "Time Series" - p.X.Tick.Marker = plot.UnixTimeTicks{Format: "2006-01-02"} + p.X.Tick.Marker = xticks p.Y.Label.Text = "Number of Gophers\n(Billions)" p.Add(NewGrid())