@@ -560,7 +560,8 @@ <h2>2. Colour and size still apply<a class="headerlink" href="#colour-and-size-s
560560< div class ="cell docutils container ">
561561< div class ="cell_input docutils container ">
562562< div class ="highlight-ipython3 notranslate "> < div class ="highlight "> < pre > < span > </ span > < span class ="n "> fig</ span > < span class ="p "> ,</ span > < span class ="n "> axes</ span > < span class ="o "> =</ span > < span class ="n "> plt</ span > < span class ="o "> .</ span > < span class ="n "> subplots</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> ,</ span > < span class ="mi "> 2</ span > < span class ="p "> ,</ span > < span class ="n "> figsize</ span > < span class ="o "> =</ span > < span class ="p "> (</ span > < span class ="mi "> 11</ span > < span class ="p "> ,</ span > < span class ="mf "> 5.5</ span > < span class ="p "> ))</ span >
563- < span class ="n "> crop</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> render_shapes</ span > < span class ="p "> (</ span > < span class ="s2 "> "cell_circles"</ span > < span class ="p "> ,</ span > < span class ="n "> color</ span > < span class ="o "> =</ span > < span class ="s2 "> "EPCAM"</ span > < span class ="p "> ,</ span > < span class ="n "> cmap</ span > < span class ="o "> =</ span > < span class ="s2 "> "magma"</ span > < span class ="p "> )</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> show</ span > < span class ="p "> (</ span >
563+ < span class ="c1 "> # Both panels share the same EPCAM scale, so we draw a single colourbar (right).</ span >
564+ < span class ="n "> crop</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> render_shapes</ span > < span class ="p "> (</ span > < span class ="s2 "> "cell_circles"</ span > < span class ="p "> ,</ span > < span class ="n "> color</ span > < span class ="o "> =</ span > < span class ="s2 "> "EPCAM"</ span > < span class ="p "> ,</ span > < span class ="n "> cmap</ span > < span class ="o "> =</ span > < span class ="s2 "> "magma"</ span > < span class ="p "> ,</ span > < span class ="n "> colorbar</ span > < span class ="o "> =</ span > < span class ="kc "> False</ span > < span class ="p "> )</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> show</ span > < span class ="p "> (</ span >
564565 < span class ="n "> ax</ span > < span class ="o "> =</ span > < span class ="n "> axes</ span > < span class ="p "> [</ span > < span class ="mi "> 0</ span > < span class ="p "> ],</ span > < span class ="n "> title</ span > < span class ="o "> =</ span > < span class ="s2 "> "full geometry, colour = EPCAM"</ span >
565566< span class ="p "> )</ span >
566567< span class ="n "> crop</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> render_shapes</ span > < span class ="p "> (</ span >
@@ -571,7 +572,7 @@ <h2>2. Colour and size still apply<a class="headerlink" href="#colour-and-size-s
571572</ div >
572573</ div >
573574< div class ="cell_output docutils container ">
574- < img alt ="../../_images/f664a4c304f2eeb3861e5f343b4193db75e6766f96fedfee843cb2e9b649fe53 .png " src ="../../_images/f664a4c304f2eeb3861e5f343b4193db75e6766f96fedfee843cb2e9b649fe53 .png " />
575+ < img alt ="../../_images/2e89be7ab5f6f3e9ec0c3660503479d32fcf1e947cc2a0693d3592de6a1f6544 .png " src ="../../_images/2e89be7ab5f6f3e9ec0c3660503479d32fcf1e947cc2a0693d3592de6a1f6544 .png " />
575576</ div >
576577</ div >
577578< p > < code class ="docutils literal notranslate "> < span class ="pre "> size</ span > </ code > sets the marker area (matplotlib’s scatter < code class ="docutils literal notranslate "> < span class ="pre "> s</ span > </ code > ), independent of the data.
@@ -582,7 +583,7 @@ <h2>2. Colour and size still apply<a class="headerlink" href="#colour-and-size-s
582583< div class ="cell_input docutils container ">
583584< div class ="highlight-ipython3 notranslate "> < div class ="highlight "> < pre > < span > </ span > < span class ="n "> fig</ span > < span class ="p "> ,</ span > < span class ="n "> axes</ span > < span class ="o "> =</ span > < span class ="n "> plt</ span > < span class ="o "> .</ span > < span class ="n "> subplots</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> ,</ span > < span class ="mi "> 2</ span > < span class ="p "> ,</ span > < span class ="n "> figsize</ span > < span class ="o "> =</ span > < span class ="p "> (</ span > < span class ="mi "> 11</ span > < span class ="p "> ,</ span > < span class ="mf "> 5.5</ span > < span class ="p "> ))</ span >
584585< span class ="n "> crop</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> render_shapes</ span > < span class ="p "> (</ span >
585- < span class ="s2 "> "cell_circles"</ span > < span class ="p "> ,</ span > < span class ="n "> color</ span > < span class ="o "> =</ span > < span class ="s2 "> "EPCAM"</ span > < span class ="p "> ,</ span > < span class ="n "> cmap</ span > < span class ="o "> =</ span > < span class ="s2 "> "magma"</ span > < span class ="p "> ,</ span > < span class ="n "> as_points</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> size</ span > < span class ="o "> =</ span > < span class ="mi "> 8</ span >
586+ < span class ="s2 "> "cell_circles"</ span > < span class ="p "> ,</ span > < span class ="n "> color</ span > < span class ="o "> =</ span > < span class ="s2 "> "EPCAM"</ span > < span class ="p "> ,</ span > < span class ="n "> cmap</ span > < span class ="o "> =</ span > < span class ="s2 "> "magma"</ span > < span class ="p "> ,</ span > < span class ="n "> as_points</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> size</ span > < span class ="o "> =</ span > < span class ="mi "> 8</ span > < span class =" p " > , </ span > < span class =" n " > colorbar </ span > < span class =" o " > = </ span > < span class =" kc " > False </ span >
586587< span class ="p "> )</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> show</ span > < span class ="p "> (</ span > < span class ="n "> ax</ span > < span class ="o "> =</ span > < span class ="n "> axes</ span > < span class ="p "> [</ span > < span class ="mi "> 0</ span > < span class ="p "> ],</ span > < span class ="n "> title</ span > < span class ="o "> =</ span > < span class ="s2 "> "size=8"</ span > < span class ="p "> )</ span >
587588< span class ="n "> crop</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> render_shapes</ span > < span class ="p "> (</ span >
588589 < span class ="s2 "> "cell_circles"</ span > < span class ="p "> ,</ span > < span class ="n "> color</ span > < span class ="o "> =</ span > < span class ="s2 "> "EPCAM"</ span > < span class ="p "> ,</ span > < span class ="n "> cmap</ span > < span class ="o "> =</ span > < span class ="s2 "> "magma"</ span > < span class ="p "> ,</ span > < span class ="n "> as_points</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> size</ span > < span class ="o "> =</ span > < span class ="mi "> 80</ span >
@@ -592,7 +593,7 @@ <h2>2. Colour and size still apply<a class="headerlink" href="#colour-and-size-s
592593</ div >
593594</ div >
594595< div class ="cell_output docutils container ">
595- < img alt ="../../_images/6896d6f3e431546fb9535b1c3bf97ddb2576ee76eafb09f8b4ac8b47eccd7efc .png " src ="../../_images/6896d6f3e431546fb9535b1c3bf97ddb2576ee76eafb09f8b4ac8b47eccd7efc .png " />
596+ < img alt ="../../_images/7d5e0e9f388852ae2adba09bfae619e6fdb43ebe4c40b88edb23bdea02385df2 .png " src ="../../_images/7d5e0e9f388852ae2adba09bfae619e6fdb43ebe4c40b88edb23bdea02385df2 .png " />
596597</ div >
597598</ div >
598599</ section >
@@ -693,10 +694,10 @@ <h2>4. The speed trade-off<a class="headerlink" href="#the-speed-trade-off" titl
693694< div class ="cell_output docutils container ">
694695< div class ="output stream highlight-myst-ansi notranslate "> < div class ="highlight "> < pre > < span > </ span > N= 1000: full 0.03s as_points 0.01s (4x)
695696N= 5000: full 0.13s as_points 0.02s (8x)
696- N= 20000: full 0.51s as_points 0.04s (13x)
697- N= 50000: full 1.26s as_points 0.09s (15x )
698- N= 100000: full 2.50s as_points 0.17s (15x)
699- N= 167780: full 4.19s as_points 0.27s (16x)
697+ N= 20000: full 0.50s as_points 0.04s (13x)
698+ N= 50000: full 1.23s as_points 0.09s (14x )
699+ N= 100000: full 2.48s as_points 0.17s (15x)
700+ N= 167780: full 4.15s as_points 0.27s (16x)
700701</ pre > </ div >
701702</ div >
702703</ div >
@@ -733,10 +734,10 @@ <h2>4. The speed trade-off<a class="headerlink" href="#the-speed-trade-off" titl
733734</ div >
734735</ div >
735736< div class ="cell_output docutils container ">
736- < div class ="output stream highlight-myst-ansi notranslate "> < div class ="highlight "> < pre > < span > </ span > N= 424: full mask 0.10s as_points 0.09s
737+ < div class ="output stream highlight-myst-ansi notranslate "> < div class ="highlight "> < pre > < span > </ span > N= 424: full mask 0.09s as_points 0.09s
737738N= 5833: full mask 0.10s as_points 0.10s
738739N= 18606: full mask 0.12s as_points 0.12s
739- N= 39125: full mask 0.16s as_points 0.15s
740+ N= 39125: full mask 0.15s as_points 0.15s
740741</ pre > </ div >
741742</ div >
742743</ div >
@@ -762,7 +763,7 @@ <h2>4. The speed trade-off<a class="headerlink" href="#the-speed-trade-off" titl
762763</ div >
763764</ div >
764765< div class ="cell_output docutils container ">
765- < img alt ="../../_images/827afb7dddaec5285fd0b9c78af6fd72749175941494151c9ae8f58aa57ca193 .png " src ="../../_images/827afb7dddaec5285fd0b9c78af6fd72749175941494151c9ae8f58aa57ca193 .png " />
766+ < img alt ="../../_images/de59cbe19573655e864703983ac44f0046efcf54ff6bc63f7788fab428a29a51 .png " src ="../../_images/de59cbe19573655e864703983ac44f0046efcf54ff6bc63f7788fab428a29a51 .png " />
766767</ div >
767768</ div >
768769< p > The two panels behave differently:</ p >
@@ -790,27 +791,13 @@ <h2>5. Backend and the 50000 rule<a class="headerlink" href="#backend-and-the-50
790791centroids (< code class ="docutils literal notranslate "> < span class ="pre "> AS_POINTS_DS_AUTO</ span > < span class ="pre "> =</ span > < span class ="pre "> 50000</ span > </ code > ), because matplotlib’s per-glyph cost
791792starts to dominate around there.</ p > </ li >
792793</ ul >
794+ < p > The full-section < code class ="docutils literal notranslate "> < span class ="pre "> as_points</ span > </ code > panel above used the default, so with 167780 cells
795+ it was already drawn by datashader. Passing < code class ="docutils literal notranslate "> < span class ="pre "> method="matplotlib"</ span > </ code > would force
796+ per-glyph scatter instead, and < code class ="docutils literal notranslate "> < span class ="pre "> method="datashader"</ span > </ code > forces the raster at any
797+ size.</ p >
793798< p > datashader aggregates and then shades, so it cannot represent one distinct random
794799colour per cell, which is the default colouring of a labels element with no
795- colour column. In that case it falls back to matplotlib with a warning. With a
796- real colour column, as below, both backends work and differ only in appearance.</ p >
797- < div class ="cell docutils container ">
798- < div class ="cell_input docutils container ">
799- < div class ="highlight-ipython3 notranslate "> < div class ="highlight "> < pre > < span > </ span > < span class ="n "> fig</ span > < span class ="p "> ,</ span > < span class ="n "> axes</ span > < span class ="o "> =</ span > < span class ="n "> plt</ span > < span class ="o "> .</ span > < span class ="n "> subplots</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> ,</ span > < span class ="mi "> 2</ span > < span class ="p "> ,</ span > < span class ="n "> figsize</ span > < span class ="o "> =</ span > < span class ="p "> (</ span > < span class ="mi "> 11</ span > < span class ="p "> ,</ span > < span class ="mf "> 5.5</ span > < span class ="p "> ))</ span >
800- < span class ="n "> sdata</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> render_shapes</ span > < span class ="p "> (</ span >
801- < span class ="s2 "> "cell_circles"</ span > < span class ="p "> ,</ span > < span class ="n "> color</ span > < span class ="o "> =</ span > < span class ="s2 "> "EPCAM"</ span > < span class ="p "> ,</ span > < span class ="n "> cmap</ span > < span class ="o "> =</ span > < span class ="s2 "> "magma"</ span > < span class ="p "> ,</ span > < span class ="n "> as_points</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> method</ span > < span class ="o "> =</ span > < span class ="s2 "> "matplotlib"</ span >
802- < span class ="p "> )</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> show</ span > < span class ="p "> (</ span > < span class ="n "> ax</ span > < span class ="o "> =</ span > < span class ="n "> axes</ span > < span class ="p "> [</ span > < span class ="mi "> 0</ span > < span class ="p "> ],</ span > < span class ="n "> title</ span > < span class ="o "> =</ span > < span class ="s2 "> "matplotlib (167780 dots)"</ span > < span class ="p "> )</ span >
803- < span class ="n "> sdata</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> render_shapes</ span > < span class ="p "> (</ span >
804- < span class ="s2 "> "cell_circles"</ span > < span class ="p "> ,</ span > < span class ="n "> color</ span > < span class ="o "> =</ span > < span class ="s2 "> "EPCAM"</ span > < span class ="p "> ,</ span > < span class ="n "> cmap</ span > < span class ="o "> =</ span > < span class ="s2 "> "magma"</ span > < span class ="p "> ,</ span > < span class ="n "> as_points</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> method</ span > < span class ="o "> =</ span > < span class ="s2 "> "datashader"</ span >
805- < span class ="p "> )</ span > < span class ="o "> .</ span > < span class ="n "> pl</ span > < span class ="o "> .</ span > < span class ="n "> show</ span > < span class ="p "> (</ span > < span class ="n "> ax</ span > < span class ="o "> =</ span > < span class ="n "> axes</ span > < span class ="p "> [</ span > < span class ="mi "> 1</ span > < span class ="p "> ],</ span > < span class ="n "> title</ span > < span class ="o "> =</ span > < span class ="s2 "> "datashader"</ span > < span class ="p "> )</ span >
806- < span class ="n "> fig</ span > < span class ="o "> .</ span > < span class ="n "> tight_layout</ span > < span class ="p "> ()</ span >
807- </ pre > </ div >
808- </ div >
809- </ div >
810- < div class ="cell_output docutils container ">
811- < img alt ="../../_images/10477e56009357f96b8f3de3cd9b7de98cb94da4e83db5799c2872f143e83d71.png " src ="../../_images/10477e56009357f96b8f3de3cd9b7de98cb94da4e83db5799c2872f143e83d71.png " />
812- </ div >
813- </ div >
800+ colour column. In that case it falls back to matplotlib with a warning.</ p >
814801</ section >
815802< section id ="when-to-reach-for-as-points ">
816803< h2 > When to reach for < code class ="docutils literal notranslate "> < span class ="pre "> as_points</ span > </ code > < a class ="headerlink " href ="#when-to-reach-for-as-points " title ="Link to this heading "> #</ a > </ h2 >
0 commit comments