From c3a6ce567c21077da5a982d31998ed853525f305 Mon Sep 17 00:00:00 2001 From: Mark Jajeh Date: Wed, 5 Aug 2026 13:42:38 -0700 Subject: [PATCH] docs(2.0): [D145][D151] named-panes example + gallery screenshot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit examples/37_named_panes.py: the pane workflow in one screen — list-form mosaic with real names (depth spans both rows), link_x='col' keeps the price/volume column aligned, and view.pane('price').set_range(...) zooms programmatically with the linked pane following. main() demos qv.show + a pane-scoped RangeEvent subscription. Wired into the capture tool, the gallery, and the example-mains regression list. --- docs/gallery.md | 9 +++ docs/images/examples/37_named_panes.png | Bin 0 -> 57867 bytes examples/37_named_panes.py | 72 ++++++++++++++++++++++++ tests/qtviz/test_example_mains.py | 1 + tools/capture_screenshots.py | 1 + 5 files changed, 83 insertions(+) create mode 100644 docs/images/examples/37_named_panes.png create mode 100644 examples/37_named_panes.py diff --git a/docs/gallery.md b/docs/gallery.md index f77adf7..45a8b01 100644 --- a/docs/gallery.md +++ b/docs/gallery.md @@ -80,6 +80,15 @@ ratios, and a figure suptitle — [![Mosaic layout with spanning panes and a suptitle](images/examples/36_mosaic_layout.png)](images/examples/36_mosaic_layout.png) +Named panes — the mosaic's list form names every subplot (`"price"`, +`"volume"`, `"depth"`), `link_x="col"` keeps a column time-aligned, and the +same names address the live render: `view.pane("price").set_range(x=…)` zooms +programmatically (the linked pane follows), `pane.export(...)` writes one +pane, `view.on(..., pane="price")` scopes events — +[`37_named_panes.py`](https://github.com/jawjay/qtviz/blob/main/examples/37_named_panes.py) + +[![Named panes: labeled mosaic, linked column, programmatic pane zoom](images/examples/37_named_panes.png)](images/examples/37_named_panes.png) + ## Getting started
diff --git a/docs/images/examples/37_named_panes.png b/docs/images/examples/37_named_panes.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1951386ed3abcc5fffc53526e7e9012cd480c9 GIT binary patch literal 57867 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

{!tP)9#E(UsaAQm(PS(+u*Dn=TMuW9Y0XC zgwVk^ucKpPV4&>FVDL1~^Z>U6W)IJ*0hV%Q*}LjL5QLevqM=Uo30+tcnJmHOAxpC* z-uC;dtM`TM*U1+i7N=Qkm;1AnO?#R1v{{Y3yUzWN_k82Bw;J{VqeR*W>9CJi+5&^~ z$fW>Kfb`5cj2q5+){xwX&Rv4W0b|^MMa1T6#XwuL3K&aA9w{0afTNHRDCM-sf!9|{ zVHu3Dt=g^sV;L~ryXQM*Z&fdIw)*3qCY!Sva)orjaV-8yj8vJAK$>$^kDXhHb z^ZjVt=j^%6+M8pO4px$J6cpLp(nXZg34J^68Xi04^bnq?j-bosBl= zsmvE>{&t5ZGyCNdnYFrDbuvYwvx;og)4XSV`%O1jxGCg{XT(CB`aL;Ezr+)chtCL~ zi74#Z%>NV|MNl!W!~2!G#hh2?a%{H-r7Ka893Ry7D!-2&4o@7EKi^m_M$!|RI^DWV zZ#Ee;P)3#Ym#~cL8qg6Ok9O5&0XabP7=5gj6^%z@am{(u)9DerjE45^$@%`VF>H&A zM;30&wkbHbV!j_ACmM`4e3ZvvPd2*}7*78V|3s8m=Pfa?Xegt>z} z0R$B6IfMgaIIoyhvc$|Ow{g3_cAC$pLbHiM4?BCf$Vyw~+{okg%3fHXs-(~);067c zQX8+&pEh+=nhJ>g4xc_?cJP9q%h-_WmgZGF`LBrmAU|@Yv*Xa(%IX(v$AUd`9HgDF zl>sc};}a7=EszlsT7%(~!D^p=T%g(P>t(5geZ~p=76#|&L39&rC8zQ%bVQG3hnqLv z#`T3#0qpNx?-k1mmHS<FTJg&3L&3Ih52x^x zQ8`FE>tP?__MJO2ku3EsEk1b3XZm_1y}(~>&pY9yyZ7!D5*2{Q#h|yjCc!ND+ZWPUBuuCOy`8NY?IzzKs&~tLcc(UBlmy!G22>cqZGmgRs z*reSxDmd%0`A_2iK`GF*j=g5Y{Q)c(K?AcDYyb%Z!(~*Ig!|6sCXi1$MaZzQu--54 zgTb8s%8gCKQ}8$d4>qN_S2^$HJ$b)HFCF_VfBCs5;ovJm7iBC$BZv#!gITuY8oc76 zZLF&x`>&F96G}S#xptRP5$D9;q<_<%G5`y-w?S_JauhTKw_j~w%m+{kdL}Kc&q;Jh zh)6L$=tsyfpx|b3ea&m$dlNKPl$F^Py(A!RM#^^Q?u3^rK}8 zQNxXp6`mR!fG4>MJHiMEbjx2s!v{7o-?wiqt*!n1{Mbh?-@G|*$4N66y@@W}?ncic zAz{?S!CS(JIlibMxwQ2RbL9|gX$o~N($G4;SR690Nb~K#v9_V@a}A{!+TkM{BSc4} zw`^o+il4ArZ^b-+wqLKGQf){XWRiI`wHoyp#>O}wG&&i8hO8>Npp8^{8q05Q?iAgy zXvkIk9+$0Z!a^czn*CWo7W*W2>8B4#^mkK?h;`~w{l!g&BSx#?7aXKvk_IpG;oS`4 z40d6zkl;XrOVj(iJLt?5@lhBw(gF3xD`@ZDMY(%N~iB+&^zYD#9-( zMS7$4%Ut78O~fOqc?*A5lZY35?iw68M@G`kTJ-@~Jv95+(F5lMTK*6s#edo|5QBB{ zXKE=pda4Nw6YQB**}Ev#f|t37t$+We)d4s-)6vsab%{1v3jJcuUPqQ08zq~3h?nA_Xz!1v^xEi|SG1SP13JV6bedXbm;m6uW9SbBm3UgYk$z&u23R03HU zJL+2*Qt*%kwr=?Gd0Tp+kWL-lz%YBG1TnPu2zw$%G8lT6>Uzgivt^N`<>G%*GB ztRv^4e|g}U{tsf&^Pg;-3`2IlvLr?lSyjHc(T&@Z3bJFx3uivAYF`GM0cX3YSd+Yz zfwYK3ntXW8$ie4fwyASmJ`%F<03PXBd$}l{DiXB+2ZY|VKIc&X$0~GeAc#Fw1RMtQ z1!V^YJDq>U$zRQ2IcGpl4bIc*0~xM|hu)~QK5!1@=F&z9um2=2$JC1tiOu5{%Wj9I zha2WCUvtyAq~f|ZSvJo%;;@So640obeZe6;2=#)aiAv5Ry35cn)dOYPDGJqb*1a~_ z(|H)-f!cTW=41#wk(gBfNh>wdvnND6VA(e!^O$eE+aKMFZr7nXjgKc^jmDD$vT0{D zr{9SSkb1C}044kV8+A9Cl^+Xn6A#Gg=-g8Ysl;daZ3*_p*EFW_Ee+n-Uh&Ygf?bxj zwrN7Nw6t79qM&5*RvK)L@jY(XsO?Sh7|M-FEeIj8D4FIFWh>IIoU;gymNq)1a^JU zp^~S65#OJ64v6;ehMl3D@c=zx?%3PNp4;DSQgo8fWh#!kc4GRy^t%JeldbkDtl5a5 zE~H82KM+C77@E&HuJj;TNl8-Ju?^A(Ac38oFmcp-Wk9UCjYN@=W)nH{wpUVpA6AH9@BtdMq}2i8Rc}jq5W>7YpexJOoc5nD}AK&I#-S)hmV9 zV}Y$0mec)v_m-e@f?dMWu*0zF#yJFrc8zrhLF06a0ZG_3ASg8 zi@%+2hBs_c?sFX&D*$swKddNzsL^!wrEG8;KX~Ed;l~f>ZkhPVLDqQ(?F*EuUkJ zAdM?4D`V7JLIe8fyxJ_$)vLgS!`}aG7$#6x!7dusrhop$J{s&e+Qr)tD;l?j;;v*7 zX)5ZS8|f;EOALD!5Oq=7lWi3M(d08>OA=)*sNg`r!$xFy3r!B(OEbrB@Cz~2gUuug zV`rkhxKcQ&+bqLyfQkO$jhMs|ocB zxNO+*Y?%|=sSLHelo=hAO=hWHOU+{cFpKegzrsV5==pq-8G@ce?+v3Bpmhu?`sX=| zuyKrP7B;=?!`^tHMh)~xPrz&xUfU&Yd&SxDIrF`HI&yejwEqp8r`R5`YF<1UF>&Se z>^8?2cMEM(O7SgXY;v9g{C^ri9pt#eTe}X>?Enad&>sw`$O#c^mK}qf7{+kj?l@L-4bRq0Cf;|Gj zFTfU`JmtbS=8s9;5Cs&)qe&6=fRhP)$BiSNNaR7GOjIGTLV0AJ_cx}2bODJUUb|<= zFVm=XM*8{Q4nx$v?madO)e=60{=+s1tZOH@IQ}8bKL@D2{DLSarPR=^Ba>!tIEUA_D@In_xA68 zbv||Ht}2$`x*deaM0HUfGo0@07i3~9Zdzjc^b`f_=#6Z3qDO&GXQ`*^n^fTVUCQn|9szOZfIl_AGO-C-nH)b9bQhu z#XmXbvJf@l8X47HoUFbt*9PVXc-JL54KKpuJQd4p{CSp!(^_@AxDQcJ9liXMP+Kbz zh__cGXAua3O97<)7rU%)`?3t6FjI$zN<2zu7Qv9#9@aJ0%`Gj!AKbtkze4+YgtMD> zhw&M2(!s?a6eBxb0U9&oW>Q(E9PFpM8`$h3bhvsy9pcN%HQ2;%kf_XxYzoMU5|{Z2 z2(%r3_4?r$U--UPh$#z)n@i&twpDXO;@Rc#0u=n}BvW+c9tl&R|AZYnr@M5tgNzq8 z16M6D(1&=2imthYMko#$6W99HlMQUK>;}&8By=+A&29y)9*L5-;0Jdb($Z(>6Oz80 z;SqcJRFFxP)Lfen+X}5%+A8rnsW;l~)W%_~XOkOmXlJh zv#+XAdF8npPRaCL@&@-U{_d?whM2p`l0Pm>4qh`Wx;?AiU-4`JLC^=CSUp1sxv{sm z4gzzDrBrx;`|}j0i?<|4<{cuz$|WDURqX033gwB>IpYzhyb|r&gnsImF<2+e%Wl5N zeWKnntu@i{k=&Eff2!@k7Dig)tqM#KLR+{--EQJe?Qm|Y^u*|B*8Nb2^lt~_fmI^q zDze|_du7T8z>|W&z?Fur)gE3sqOZGreeky04Thjn+#SJCLub1fdDd8r*58K4LGf+V zd65~f#5y8+mfi+4R4ei1LI@ZbSvWsPNyPcZGF7NrxnhQZCkt^CadroGw+SN~E)1Y; znr_BKF2MJQbB0l~57;@d(Z$7m3a=9MO<$1fVpq&?p1l}z(~Z$F{xM$GiJ{{NE{Vk* zU0*H2i)zYhou{^l*RT-;8e)kn93qV@9!Q&OYE)Ddnj5nMBDR%}9SbPjcAMckLN2ugpvD3~)wAxwATWM^T0O6xs`PtBo^VzxCda;a8GF zJT0}~*rOZq`mS@rn*!a#EsK;S1KwmYOpX_M^>m)VY{QK&-d21~%3XkV+8UyqEs%SaRwpSz068cBL*egb%iwuMUGwTTg}& z_fhEp(OM&+jnw#N>Ae9>Ew6DBLIclcdZ-HfZvQ+r|19xsWbF>S$Q{H@8Dxz3LUJ_p zHtlzDNJtVNQWF`dIdxFe2&^Udixp%HaZn! zwN5Z*^$gwjdHVS0d{8`V2jjK+=R-Lkf2^z>rKR16)YR0_={fUTWgD&}kV7&<$oVb5 z!#MZgmGbdvZe1emGTaP55enG|n!9`FC%}8lEqk+(1JvYLkqggZJb61dRvcb1kkamm zL7P{`#rOJ_4aa8<7n+<4Qh5eRPOM3S>@ckPk#Yxw2vPe@JcgY5DLmm8wQ)Z^%vo;V z)`77oG--O;+F+{T#SjA_pqDds9=F~3^Uz{P56R18!vTa@bGF1~nJV7J+u_ZfbYHB4 z9d?gzI7nd!IE36C7mM!zbk^Rk`cdw_WakG+9>HE8y%@qI0;dUU0MSIW@M@!ZM;3A0 z`Hfja;(azf?6p@r8?@Q^o#okzem6+G=`YP2x?ENyEVuqq?q%CqrU?rJEu)k>-?sal zi(%AqWpHm@tZJT%5L_sG#KC%f!j+?-%xHX6`MDnd*3QL{t0BMaHEqiBry|aU3DJ{@ zxI`?r?67-v^~(_2!WA>Ql`JkJYdEs<^1irLgTe0oG>rWS40BJP*20|*KeDV+G2?eC zedDz!JFhkPD(jzaOCTNlShxX7zguykd*l%y}g|2jOP)CvX=6w=8=@D z`xOd>UyUe-GZL`knOm_Q89DC-oO!+HjaX>lm4gze4(*D2ror4QXcfF*-_?DQw8u1T z6T_i4!o>`N*lT|?BnxdD-j#0-7upX`| zhpnJhF|-9>|GpnAOo!eGmQvN#MrDn0fve21?bBfXKKbfMT^5k9Q!DY~!ja<_<8QM{ zIPaTHn|h!oA}08QzLE5?ZEVMgIPadFt8Y)rhtH!^BmRAm_yBd@FUvZavJQdI-)fy~ zoX6MYE-Jm=^SHB9Z{x62>f7GZCF!>Pr>8d$XVQFGe%+*J{V06#ZAA7FA6Da^J#|iT zxwE0n`IS*S_mrnmxJu-04RV%TI-q%ezT>CEc*xaXcH{5Gmb2rU1^0fvexsuv*k7B! zY2;m0Lmp`LL;hQP@!s9WQ8836G>|F2v@U_B5%nww`uDv1_6hUs#VTi@Eu&JMnkXBe z3dc6_mM-o#7Yfk31(F92$8#Ci&O~wCkCM#m#%ZxtH*-P8SKz%d-G}%vDSeON~nK+=FKeCclR`Y#iLHTe_u_cP-sR+iyI5`xCsBa~A`j zuH9c`$kN{lNjn^UVXDCA%DQQA4GHb$M(Hj%qaoM-1UC}!O`eZ^eC7Po2BM2?2O;^K z9CrV}w|B4d@#A?99#o;Wx^ZkHf@!E&RdUsQm)eU7uB<4xTo>PAn#*l;FG;_IKzyW{V6_{XaC}6{4GWzy65xDl6@SykVUs=F8U_d<&RU@n%h;P_T``4hjIXc z3rbPgFr?pee}AY!4y@{?=8+3M^ucH0lvfbv>nTj2OR9kvI|p!x^WB+n9O{1VtpAKO zQS6FE8XQ<*Y>I-~IPWqP?>l$y^!39TL2=`hZQWZ}vsdCN1=M6#42L@lrT4gkaQxF=IF^xN8a0uBQ`dQmkzqz6 z%X<%9i{s;6=3A57X-3XJrr=0E!7rYzRVdcmb&Iaxh-eWPnSzL{N+XqOw6>3-hFw%M zk~2JrI>`;kr<#UrEGbz$mp?)TaVrpF<{xhD`K)9B>3Z5?1#-1E5g z=$L-BCJR}R)T1Eoqrp%!l7v}vbyEfeuGO=ib*^k3WABo4ZuqfspOsEW5I`!I82qCQ zi>-82RGy%DMK~Mq=2b<=ZyJP}tRyYX0!0n%ip?MJ!bQToj>zRmlrBc`8@YjTMMzq* zvU8`0D!;%HlE11J5_GsiK$}O-dS%PXcB7D7;UjU0!3_nrT(;-WUle18%<9^g{IH!H z;;_dbiu_!AUYNA*Wcz_OW%XXAN#@O?l-1isj@&MhlM}BR2@9icB+05Vwf6IMbRlD~ zHnqO-IuGwyNp4oi<0K7DV~Pf zJ8Z2h#u>+{1CF%Ot}Fu*ZjK*28pb{fco;Z7*(W7s)YnqyNalY`O-;n$EmIF;_odLW zE4mVcvsqJ*CTQBlLOD6^JqUiSa8NTn`gTtOY7B*+E2RVp>5vYte`Q9%YFY6YBbP*p zo5=HGlaS}hi6hVZMD-`n6C7yRlyKLFPn@V4!X&ZHNS{6vpk!m;*`k~A-G95}A>uG% zuqLwVdNK+$s0HYe{sFu+Ga`b?mR4p6E}rkgQE*D2nT!116MT|*rFhM+ez0;w73pkC zE0dDy$38ZdP)0v-0;%j?=N{ME%*?hq=hpl8Nu=+6z&XnwO}6I8WU_XQmQYHN7S+?I zPX!MrT1?*Dm$uXLzTr!RZ5WA|X=#!4e7>PMfL?F1$xVjT7jT6u-sg%+kj?*e1m|0r zA;!U_M@@8StIGr|jtK7n1?#oXV`YGAKq+}#<=l>m4&coR#I-REnFsG zPXK+O`(#qUi@+h`l%0|ZLrjIZVIF!e3h0qoyf9*G6EU!9WX;- zy9B2Z<-GnKkuPwYGt91^b7;p!?C|*Z!~_QMZ=g2WK0JsEfo`i9*vb?B%GsMRSA_FQ z6`V=IzLYP2NO+q7^#g6IcEo!VQsx>6RG>bj?E(e0u%H0)KLVlyO%``#@^{0cizFDd zMz9;QDIJ1MzdHzA;P`Iew$1Ng50~Fw5usS_zWGO-H({FtE5rUN$6<#jeAwU#;L<5u zaVDda`fFORmPy?4ysF2`y*r;_SAG8c8EO`awUzY2&634@rwW?P@_T!GfsVE(Nc})~ zqyK&Drm2mPMf=yOjoIR#NY`{Cjx=rWY3Gxn_8`BO7m#R`^|ZzI=JdPt!0GpS$@2+`A9S z5(W>jSt1M`aMyQL6#_}VkXvp6s7l^(Ca09&uxuVDP32;TM2ca|kS!EBrn0hYXpAmB z6|t-Rd64F#B*9PydL7UxXw{ohP*4C|RNgb92jX^3O?JcFy})MM+a;lb1dH>$keXJE zwNOfkH5JQE!o?R(jt}*7K!V`q=7yEl17$0^lki{UD}6IQ#Oo#2-(OqL#Ekz_Rm(0lA=YuOIPz(3 zZ0Hr1`j9a(j)k_0uQo)OJauSpil}Q@|5ex4aqS62y+_vt$9o!=bSPogd=yQXs5XX@ zM=`}@AV$!9Z60()Ln~S7U&T(t517Lo0;hWE!jq1U1gyS!HxQ6*OWm=TxcXHix9)z~ z&dq7y(`OYAPZLlTLH~RRrRewX-*?!S)pHfobb+)AWIDn9eL2ii4u01OUs&TL9`9Uv z6-p6oyf(;$ks};%TRJb)t7~F%FCn1@!Y;zhIdHdHY!M71xwofj8=NN8wwU|y3!W;m z=?`ILV&pcJ3UiODcd-}H@Q27r7!OmZ_no6Ss_fXfIHZ0-=K;VXm(%12Hs+-;uNu0s z-`L&8#%6B6=eH+DmCi$87{~)8E@yatLPw_<)F;TA?grjfKL@yfs^E!UqhNyD1KWckhZys8Bla-Kk7G>v%SlHdt*DVD2CU1&Kl zL~*elN>oo@gk@6cD~BiGq7f!nU?seJXCc%J@6`O~&!2x8cDKWNBRu-6!RfxutJjhx zpe05Fzn)8tRHB#?a3@_LxcLAK(Ga-xpcaFH6wvdaHom~5Vk+3HK->*=;%nS*Jl#2m zax(`@oWox90&SY35i0zyADg%1LBLJ);Q42XNJXfbgt>K_nc>I|if-+%PkDaXqG%b+ z&CQ{5Z+MP;y?H+RF%F6}q|ylGhzLztWT$Rzj1(5y{ph&>45D!cKte+psloQCLfHy> z@A$^ivbmC%W;(~co{L=!whys%Tz7rU&w zaZ`@k2-X8?CNzJwOFpI z$b0wf3J1|Z@jZ-tWTq20FQ5!_2G#d1rit1o&kLm-KTm~UcCy;7cwW^Lff0SrVb9-J zBYQvBle048ZzKov<0RLI2`NqrViLvAhBKQdVMRw5<^^RnPR524S%P_LF1dRz=JeT? zwjT30o{~RVXz|pk-{^}E>oVJJoxR(1L3uJX+~=4FP7zcXyDwM!KPQ}f!RF7^FP?@8 zCPC4M<1SRL6+Aywhh2F$0+Dy>BeWSAU47F;!7+`90nkU4C!EcI z$Rkbx{zhs^FmhV$VYPF!XX+L7Z15&XIkhdNBt5~6CoyjUN4q_<9(+rGzBscvqjLfy zV%qAikz&o4W3&X`36TR^Wbp0Ta}HV)@Xhowl*ho}C6e7MZ*S`<)Cvr~K%x$i<2#H` zz8&}cenRz_+17&yE;c2%}<4uO^-bd zv9LKNvJ8W`co=5odH$RMIEGscrP>*ft1n73<0;#0>FgWOx`tr)Y zb*FB&2p=DjyWFhNh|#h^8xRG;XK?-BFMflv*?fTnpGCe=J)M41#=hK@lju8sfz?)7}iNSNKT(MF#kI-ub*HXwu}jN zT(f2#R!nS^0xK#yFOGtl_#Krk<%3b^Em-_&9$~cj&O6~c{Kh`~XyY!m+B=CG&Fw20 z4i*H7SN|V77(h*F248O>%eBuvEBKXre`apiK9B7_qW33&vv&5l@A9IeIJqQ`v+KPJGo%egt_~ zU%|2r?!2z9?#OZf-UB2bHxWoaUKHNTJi@du)O+r99F6qTIZvV_`In~dKdZ3Sq7*-& z#7&fGGX99O@3D6{lQD`0clJoZCzRw=R8;ct?{YD{bC5(PnWJ*J{O`1Gw;^T1glq82 z)Ywo-{)M=YlB~n*?^bW%)en#CS{5Z~+VnD*vz|O@jBKecJn5QXf}k0ptf&|eA=ii_ zkTmaxIKMtwdHxiwOPGo^!zLfI2vQlXLY%If_{&C6vPW0_j;>u!1&D&95!Hj`B-aEk z@g=lQNCp8t$Hm9*%rRR-A}I4&)c4wjyBAJTN0)>^aK9RTBj`S5M)* zBEkny8*piob-9S2lDS-eo0%jc8skjxm{M>gL)&T=Q(RQ!QaucFJrnmiY_cD(1sm6} z)x)O5p>ilc7iDG0I#kA98xcr5F)gM6=jBI;_zep!)E+#68l(|!wBk*0GY^`#_#ahU z$+op5Ue`uYw@2)}*V%e-vM;+IQTkPPH~dMWV53LOJ%a?jD-(RF4MbWsH;06)aL`)* zO#VsVFNBf%fAtF1y#sk+OaBO5{FK$y)jM9pOcTeypf%xn3a>_cW>KuWfX1Yw)T|_@ zd64R$rwvJa+?_jw(FAmBv^1TIglYPN2aaOQ@bZSGD5m_V{EeS@-G7Jr1+`Y5UD+s^ z|5KcQ+6D#^SH8{@*))zHDEx2eL-lav;$LYf(9xfzoaUmS+o+oU~MhT6{;XadgM^N`rtcx?s)n* z1W+r9oY>G8on*!bMMVQH2jZJEpDGwux{3d)I{lncqeQOu#ubkGnJa~9)nlD>{T+`} z@2YoGrGy4Y$=aT-XkrmkQAy<9e00-xS8V;4bg4Uh3ZLF;B|zxV@dy+70OM z?}g}E`8;V7FKIaH7s8ldmdPH*70BcWyGmlopsGZE3NJ_wahSb>x15nTYZr)X{CLir zmgy=aZMWIQk+O%0v+}eBgk)CmEuY zXF0!refTYnOW*)eMz4sMl*I8KahPK_G;p<=<>L(aD0%PiM9y6UnHFDAH3!g2vN= z8gmCvQf>{tww5IMF-oc-+b_VqSZCx&NOrFezQ$wP;6&SKKzS=rmxYnLc=TnEirz*6 zPYo#=Q$dXz_(|;)MtaiqBubeX84OZxMXh7uRfpl>fdMnIqhATXf5Jof^x2h*)FelU zroBe^v1evl0-1UvikW@HSQ@|1lOe!rJ#(Ia~ z-0&KiZ8yAF4}0Lj;b9Me7)U-+3w-E z*}4eSV)j+}B5Er=L;GfwS67LAK99i3y{M6#)4Ajvy(;^#9L}qphTA6(;xUD>sopt& z*<2R5a?~u_Xz<1-@y9Tygew`5R`TnJ4-UEt06j!OfSjI~X{2B2oFm_e*`b`cHrbI* zw1tprn_xA|JK}W2+kgA+-SCygr*LEToGb2!2ie$17u09JetoIc!@RH$n1rXux+@uk z!93he)FB98L#Smi*>c!*Vy9^`aa&{V@iUU8eV41V@aW1^ieA@1LOdv6Xz~xj6c-(y z1}?=bc`tAnA|d!SA8>eSb}%x~7-hrj<#(dQ6`^L#kg91Na|OKju(eT*$RQnEJ{Yy(ls?62w4s2NxZL^;pg}c?qbC@&w+=g02eqpLdOsh zVRHNeqsKT3^m8ELmqut~dxxgB^bZu!_y^#zbLCHzngWi5w;5`NI%FQS0VtZRaWddR z!EgO5&RAkT0tX&fSm(qJv4zj`7B-=&N5ZkD02dl9aT3B@ul4w#uRSUX>@*ZibSbg^J!$vg$2VKEx5aW0kHH zCN?nlnXsNlZUeJ}nuW)_NWz0MfOFxd5@!@LXlc{+lXwtcuhd|RDZhec@FD!LGkj;wB#;+x5qW`Z_qTM&R9?`Los3Q8*J%mQx zWm}$1u)o!aH%=DYx16-~669U31k87m2*=eiY8wVFGPg<#>ysT~6s4qf54)hMNZi-c z*j;Z?6%uF@miAgZY3wI-Iqw|0WC0`|i7A1Pv;Le^1mYR?6|mF-fP1%*Yvj3rs{sWU zp;28q2)AEBWIn{0iYZ59=fSfCa0i^j7Hf7jz;00^;!_f!PGrchfg1oMcu^OJ39ax$ zdI^(WAT2wo6)}YpZow|3wTh>bUEQ*4cvx`|>U7 zaEG_K3;`<#5K{JvZFXOmXPXdWAn&s$j2+b9#8R?HQVeEM0JFR;@^5=bs`VcCgY) zyx>KfT?^|+Z zke10b`QYwQDFcg!bB`n0-=F%A_85KFYAcaVa^=1f$We`IFxo5{|ET(#=h`6u;2O$V73OvV@>kofaCOsk7~$ zFY{(zrBM|P&d2bRu-ON8?};67`p4Ff%tT+(rzkC9!>}5cA9)IC$hos;L4@%D&WGKDh~7&zoL(V4$WocRfY z%)~0q9QPeP^z*AJR@exV{!NHjZEzgJA+^H=)akVJbn-N*Lx&E5XVj~wd#?gJ>51DF z{r0=+6Nn;9t?1#O&cJcPM5~x`hd$2VpG@2ab-+Yi=BJ|hh1FI*dot5|YB0>!PcAu> z2w2M<+565cZDv6{`+#~=(!U}ZvzpYC$46zUwogRdHB?v)#UOTQ?NZ6eZmzzo?(2QT z=;?e;7TK1njpn>y&I#3>-ejKrt(KbM1u0Px-21h(r!DSpEE^2~c}JLrfs?Lbf=G*# z1deYZ-o-XyNZ?q~Ci$1f=@Ye>>&^s~2 zRO=wFp%=N{Tkj98a)r+kdFkO%eWN)C3Xu@O* z47xtxjXa;(bbu?pynJx%PFt}$4|oi8?^0=^39qhK2$}<#lcbNpC~@pZQ_B8 zZzXG22GGrdvDL_VzFnz7I^ztc#?%y3?n)n;jR*6pPPzczrwAQe>&gEQlpS+DPSjLE zYa;I|vbf#{Qx9+=3g9RM+d*_mAl6+9Ao3@#d_$Pp;ndu;d?!A>8uM%ZV2#>T$HPcT zWbP(jjzC_9lTgUCVO@6L3)E(CG6D03NoxfbOP2Zl>!&$!RSY4+%Ax<@vEKv4+2(71AxOnVw{a?{di!$iI|LCHy3$7$x_=}WF#%+i2 zbxgs)ERuR4$*^QX)k;h**etaa#@s&34DK0I2k``zvo+9Vu z=ophjG+=F?M-<1q7>Pt1CED6LIy{h2i-lHBB)DVmBV}&ENFJfxxDpaoZ?Ly- zwl;pX>EbI~T5{CcLE6K}z#}5kXMLMUXY!-`=9;Yb)H1f(%X5vrT?})`P~Q)1?$@7u z?7`j7j;q(uzI&auwu7cdV{;Nvl1md@+_#TO~JhiE7 zhPVQ}wj3neuo)z(1EflF(4&yhWS@Jkhi_rk(g$ zhT=a#0WYzXi?UA5lh;-NQxcMQ>!+>k_ove(jcDl2eAdm|LENnmC6)biPK$D-NBa8K zMaT5*UQ2vdwEr}n>90JWN0xZ%GOyM+75m=qxmFRok7jGtv3xbYw#xHU)Uuy=Lq@h# zbytWqN12VSV=vZl65*h&jf`1&4j}if<~qdb%a%}AZADz;DtUk9YUOBBU-l6nZMpf6 z&r0gh^PtwFD?}-!mM3Ez!Dbce`_t6Ub2l5dI~p0YBnZEcZ+=Vwgwv^K$))&j8*c5r zXwTpFRnUro>oZ&QfB-!i=tf@a!1@#!>tch)-yanQ^gyC7Bc_?2s+KWG0!EMXPcMAn zybwp>O@F{xdh_0Z=_OhKIGa;rg74%)3Tk=0b>+`ATg%lc?ApFw#PF_)gUk&kf-onN z#+i|wX)98@dVc4;G&mYzf*Ytc|9FP~iuK~*sAx;ao9RN@lR`ATeOR&z^G(0Ry*}f8 zuX`rk_VL@5-(Ng`N5{qO_)Lza)i97{MdDN}P@r zOj}`vak@Bo?8IZCP3D)>Kvxs4u*Sw7gJ+}BaJ!U52GE?9!wlstO$Hrtd+`!Za@f^6 z_K}$4h>;Srd|3Ppr^66HdhHo3-$uu&8vJbKHAyd-mbKbnDarrtTGJSENyLb zGcwAi(&7R$(7Y8AS_D8ryCc2l)X9@EtN1l4WJ{Wpt3N{GwIS&M5l{(U#ZwDT0`4dq zdJnRak~JbLka|Hh`+33LZ{BVaqMiEZrxMrXOcOS8Z~z&GP!HJ(-=HH39u_ILDpXSF zsJ+EdBD|hFNqtd_Z#?&;`cQla60+1Bl+mlFBZyKVkHmfcXLh^ZPGZRUxtvXUqcpc$ z>~4|s5^C~qjyZmQC4cVx%c!=-rUn8hQE9MLA_7KZ>~J53PwMr#Zw19QD-6s1F_~jmRW3*pMcbnB{}~ zJA&$ya%k%qYDRTi+xI9;P(uIT-y_R{mY8?Dv zNCd$Dm&J9QrZ0vh<~rEo0eVXN4MRr9CRqvG9tYHnPVj{eT=j|;9! zhqTk9xv4jK{s|F8Gi)`OThOgN$WzXpG5W?Zg4C*4KxtMsS8!+M#?8$CYI? }rP1 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 literal 0 HcmV?d00001 diff --git a/examples/37_named_panes.py b/examples/37_named_panes.py new file mode 100644 index 0000000..ad9e0d0 --- /dev/null +++ b/examples/37_named_panes.py @@ -0,0 +1,72 @@ +"""Named panes — address every subplot by name, before and after render +([D145]–[D151], design/pane-handles.md). + +The mosaic's **list form** names panes with real words (`"price"`, +`"volume"`, `"depth"`); repeated labels span cells like `subplot_mosaic`. +`link_x="col"` keeps each grid column time-aligned (a spanning pane joins +every column it covers). Downstream, the same names address the live render — +the "Axes of qtviz": + + view.pane("price").set_range(x=(18, 30)) # programmatic zoom; the + # linked "volume" pane follows + view.pane("depth").autorange() + view.pane("price").export("price.png") # just that pane + view.on(qv.RangeEvent, cb, pane="price") # pane-scoped events + view.set_root(view.root.with_pane("depth", other)) # declarative swap + +Run: + uv run python examples/37_named_panes.py +""" + +from __future__ import annotations + +import numpy as np + +import qtviz as qv + +rng = np.random.default_rng(7) +t = np.linspace(0.0, 30.0, 600) +price = 100.0 * np.exp(np.cumsum(rng.normal(0.0002, 0.01, t.size))) +volume = np.abs(rng.normal(1.0, 0.4, t.size)) * (1 + 0.5 * np.sin(t / 3)) +returns = {"r": np.diff(np.log(price)) * 100} + +panes = { + "price": (qv.Curve({"t": t, "p": price}, x="t", y="p", label="price") + * qv.HLine(float(price.mean()), line_style="dashed", label="mean") + ).opts(title="Price", x="t [s]"), + "volume": qv.Area({"t": t, "v": volume}, x="t", y="v", alpha=0.6) + .opts(title="Volume", x="t [s]"), + "depth": qv.Histogram(returns, value="r", bins="fd") + .opts(title="Returns (%)"), +} + +root = qv.Layout.mosaic( + [["price", "depth"], + ["volume", "depth"]], # multi-char labels; "depth" spans both rows + panes, + options=qv.LayoutOptions( + link_x="col", # the price/volume column pans together + width_ratios=[1.6, 1.0], + title="Named panes: mosaic labels drive layout, linking, and view.pane()", + ), +) + + +def build() -> qv.View: + view = qv.View(root, backend="pyqtgraph") + # Downstream use of a named pane: zoom "price" programmatically — the + # column link carries "volume" along; "depth" (its own column) stays put. + view.pane("price").set_range(x=(18.0, 30.0)) + return view + + +def main() -> None: + view = build() + view.on(qv.RangeEvent, + lambda e: print(f"[{e.pane}] x={e.x[0]:.2f}..{e.x[1]:.2f}"), + pane="price", throttle_ms=200) + qv.show(view, title="qtviz — named panes", size=(1100, 620)) + + +if __name__ == "__main__": + main() diff --git a/tests/qtviz/test_example_mains.py b/tests/qtviz/test_example_mains.py index 4281aef..d5af8ed 100644 --- a/tests/qtviz/test_example_mains.py +++ b/tests/qtviz/test_example_mains.py @@ -37,6 +37,7 @@ "examples/02_composition.py", "examples/31_axis_labels.py", "examples/35_everyday_figures.py", + "examples/37_named_panes.py", ]) def test_example_main_runs_without_a_preexisting_app(example): result = subprocess.run( diff --git a/tools/capture_screenshots.py b/tools/capture_screenshots.py index 10469fe..6bc2efd 100644 --- a/tools/capture_screenshots.py +++ b/tools/capture_screenshots.py @@ -66,6 +66,7 @@ "34_streaming_telemetry": {"settle": 1500, "size": (1200, 640), "splitter": (820, 380)}, "35_everyday_figures": {"size": (1500, 1040)}, "36_mosaic_layout": {"size": (1100, 620)}, + "37_named_panes": {"size": (1100, 620)}, "dashboard_native": {"size": (1100, 700)}, }