@@ -43,20 +43,22 @@ module Graphics.Dynamic.Plot.R2 (
4343        , PlainGraphicsR2 
4444        , shapePlot 
4545        , diagramPlot 
46+         --  * Plot-object attributes
47+         --  ** Colour
48+         , tint , autoTint 
4649        --  ** Legend captions
4750        , legendName 
51+         --  * Viewport
4852        --  ** View selection
4953        , xInterval , yInterval , forceXRange , forceYRange 
50-         --  ** View dependance 
54+         --  ** View dependence 
5155        , ViewXCenter (.. ), ViewYCenter (.. ), ViewWidth (.. ), ViewHeight (.. )
5256        , ViewXResolution (.. ), ViewYResolution (.. )
53-         --  **  Auxiliary plot objects
57+         --  * Auxiliary plot objects
5458        , dynamicAxes , noDynamicAxes 
55-         --  ** Plot  type
59+         --  * The plot  type
5660        , DynamicPlottable 
5761        , tweakPrerendered 
58-         --  ** Legacy
59-         , PlainGraphics (.. )
6062        ) where 
6163
6264import  Graphics.Dynamic.Plot.Colour 
@@ -151,7 +153,7 @@ type GraphWindowSpec = GraphWindowSpecR2
151153
152154data  DynamicPlottable  =  DynamicPlottable  {  
153155        _relevantRange_x , _relevantRange_y  ::  RangeRequest  R 
154-       , _isTintableMonochromic  ::  Bool 
156+       , _inherentColours  ::  [ DCol. Colour   ℝ ] 
155157      , _occlusiveness  ::  Double 
156158         --  ^  How surface-occupying the plot is. 
157159         --    Use positive values for opaque 2D plots that would tend to obscure
@@ -211,7 +213,7 @@ instance Plottable PlainGraphics where
211213--    Use 'diagramPlot' instead, if you want to view the diagram as-is. 
212214shapePlot  ::  PlainGraphicsR2  ->  DynamicPlottable 
213215shapePlot d =  diagramPlot d
214-                &  isTintableMonochromic  .~  True 
216+                &  inherentColours  .~  [] 
215217               &  axesNecessity .~  0 
216218
217219--  |  Plot a generic 'Dia.Diagram'. 
@@ -222,7 +224,7 @@ diagramPlot d = plot $ PlainGraphics d
222224
223225instance  Plottable  (R --> R ) where 
224226  plot f =  def &  relevantRange_y .~  OtherDimDependantRange  yRangef
225-                &  isTintableMonochromic  .~   True 
227+                &  autoTint 
226228               &  axesNecessity .~  1 
227229               &  dynamicPlot .~  plot
228230   where  yRangef (Option  Nothing ) =  Option  Nothing 
@@ -255,7 +257,7 @@ instance Plottable (R-->R) where
255257
256258instance  Plottable  (R --> (R ,R )) where 
257259  plot f =  def &  relevantRange_y .~  mempty 
258-                &  isTintableMonochromic  .~   True 
260+                &  autoTint 
259261               &  axesNecessity .~  1 
260262               &  dynamicPlot .~  plot
261263   where  plot gs@ (GraphWindowSpecR2 {.. }) =  curves `deepseq` 
@@ -297,7 +299,7 @@ instance Plottable (R-.^>R) where
297299            =  def
298300              &  relevantRange_x .~  atLeastInterval (Interval  x₀ xr)
299301              &  relevantRange_y .~  otherDimDependence (rPCMLinFitRange rPCM)
300-               &  isTintableMonochromic  .~   True 
302+               &  autoTint 
301303              &  axesNecessity .~  1 
302304              &  dynamicPlot .~  plot
303305   where  
@@ -336,7 +338,7 @@ instance Plottable (RecursiveSamples Int P2 (DevBoxes P2)) where
336338            =  def
337339              &  relevantRange_x .~  atLeastInterval xRange
338340              &  relevantRange_y .~  atLeastInterval yRange
339-               &  isTintableMonochromic  .~   True 
341+               &  autoTint 
340342              &  axesNecessity .~  1 
341343              &  dynamicPlot .~  plot
342344   where  plot (GraphWindowSpecR2 {.. }) =  mkPlot
@@ -394,13 +396,13 @@ tracePlot = plot . recursiveSamples . map ((,()) . Dia.p2)
394396--    there is no Éc;statistic optimisationÉd; as in 'tracePlot'. 
395397lineSegPlot  ::  [(Double Double ->  DynamicPlottable 
396398lineSegPlot ps'
397-     |  null  ps        =  mempty  &  isTintableMonochromic  .~   True 
399+     |  null  ps        =  mempty  &  autoTint 
398400    |  otherwise       =  def
399401             &  relevantRange_x .~  atLeastInterval'
400402                                   ( foldMap  (pure  .  spInterval .  fst ) (concat  ps) )
401403             &  relevantRange_y .~  atLeastInterval'
402404                                   ( foldMap  (pure  .  spInterval .  snd ) (concat  ps) )
403-              &  isTintableMonochromic  .~   True 
405+              &  autoTint 
404406             &  axesNecessity .~  1 
405407             &  dynamicPlot .~  plot
406408 where  plot (GraphWindowSpecR2 {.. }) =  mkPlot (foldMap  trace ps)
@@ -472,7 +474,7 @@ instance Plottable (Shade P2) where
472474  plot shade =  def
473475              &  relevantRange_x .~  atLeastInterval xRange
474476              &  relevantRange_y .~  atLeastInterval yRange
475-               &  isTintableMonochromic  .~   True 
477+               &  autoTint 
476478              &  axesNecessity .~  1 
477479              &  dynamicPlot .~  plot
478480   where  plot _ =  mkPlot $  foldMap  axLine eigVs 
@@ -486,7 +488,7 @@ instance Plottable (Shade (R,R)) where
486488
487489instance  Plottable  (Shade'  (R ,R )) where 
488490  plot shade =  def
489-               &  isTintableMonochromic  .~   True 
491+               &  autoTint 
490492              &  axesNecessity .~  1 
491493              &  dynamicPlot .~  plot
492494   where  plot _ =  mkPlot $  Dia. circle 1 
@@ -518,7 +520,7 @@ instance Plottable (Shaded ℝ ℝ) where
518520  plot tr |  length  trivs' >=  2 
519521          =  def &  relevantRange_x .~  atLeastInterval (Interval  xmin xmax)
520522                &  relevantRange_y .~  atLeastInterval (Interval  ymin ymax)
521-                 &  isTintableMonochromic  .~   True 
523+                 &  autoTint 
522524                &  axesNecessity .~  1 
523525                &  dynamicPlot .~  plot
524526   where  plot grWS@ (GraphWindowSpecR2 {.. }) =  mkPlot $ 
@@ -554,7 +556,7 @@ instance Plottable (PointsWeb ℝ (Shade' ℝ)) where
554556  plot web |  length  locals >=  2 
555557          =  def &  relevantRange_x .~  atLeastInterval (Interval  xmin xmax)
556558                &  relevantRange_y .~  atLeastInterval (Interval  ymin ymax)
557-                 &  isTintableMonochromic  .~   True 
559+                 &  autoTint 
558560                &  axesNecessity .~  1 
559561                &  dynamicPlot .~  plot
560562   where  plot grWS@ (GraphWindowSpecR2 {.. }) =  mkPlot $ 
@@ -615,7 +617,7 @@ instance Plottable (SimpleTree P2) where
615617           =  def
616618              &  relevantRange_x .~  atLeastInterval xRange
617619              &  relevantRange_y .~  atLeastInterval yRange
618-               &  isTintableMonochromic  .~   True 
620+               &  autoTint 
619621              &  axesNecessity .~  1 
620622              &  dynamicPlot .~  plot
621623   where  plot _ =  mkPlot $  go 4  ctr (treeBranches root)
@@ -689,9 +691,9 @@ instance Semigroup DynamicPlottable where
689691  DynamicPlottable  rx₁ ry₁ tm₁ oc₁ ax₁ le₁ dp₁
690692    <>  DynamicPlottable  rx₂ ry₂ tm₂ oc₂ ax₂ le₂ dp₂
691693        =  DynamicPlottable 
692-    (rx₁<> rx₂) (ry₁<> ry₂) (tm₁|| tm₂) (oc₁+ oc₂) (ax₁+ ax₂) (le₁++ le₂) (dp₁<> dp₂) 
694+    (rx₁<> rx₂) (ry₁<> ry₂) (tm₁++ tm₂) (oc₁+ oc₂) (ax₁+ ax₂) (le₁++ le₂) (dp₁<> dp₂) 
693695instance  Monoid DynamicPlottable  where 
694-   mempty  =  DynamicPlottable  mempty  mempty  False 0  0  []  mempty 
696+   mempty  =  DynamicPlottable  mempty  mempty  []  0  0  []  mempty 
695697  mappend  =  (<>) 
696698instance  Default  DynamicPlottable  where  def =  mempty 
697699
@@ -703,9 +705,21 @@ data GraphViewState = GraphViewState {
703705
704706
705707
708+ --  |  Set the caption for this plot object that should appear in the 
709+ --    plot legend. 
706710legendName  ::  String ->  DynamicPlottable  ->  DynamicPlottable 
707711legendName n =  legendEntries %~  (LegendEntry  (PlainText  n) mempty  : )
708712
713+ --  |  Colour this plot object in a fixed shade. 
714+ tint  ::  DCol. Colourℝ  ->  DynamicPlottable  ->  DynamicPlottable 
715+ tint col =  inherentColours .~  [col]
716+        >>>  dynamicPlot %~  fmap  (getPlot %~  Dia. lc col .  Dia. fc col)
717+ 
718+ --  |  Allow the object to be automatically assigned a colour that's otherwise 
719+ --    unused in the plot. (This is the default for most plot objects.) 
720+ autoTint  ::  DynamicPlottable  ->  DynamicPlottable 
721+ autoTint =  inherentColours .~  [] 
722+ 
709723
710724instance  (Ord r ) =>  Semigroup  (RangeRequest  r ) where 
711725  MustBeThisRange  r <>  _ =  MustBeThisRange  r
@@ -782,7 +796,7 @@ plotWindow graphs' = do
782796                                            , graphColor =  cl }
783797                        ) :  ) $  assignGrViews gs cs' (axn +  _axesNecessity)
784798                where  (cl, cs')
785-                         |  _isTintableMonochromic  =  (Just  $  defColourScheme c, cs)
799+                         |  null  _inherentColours   =  (Just  $  defColourScheme c, cs)
786800                        |  otherwise               =  (Nothing , c: cs)
787801               assignGrViews []  _ axesNeed 
788802                 |  axesNeed >  0   =  assignGrViews [dynamicAxes] [grey] (- 1 )
@@ -1053,7 +1067,7 @@ scrollZoomStrength = 1/20
10531067continFnPlot  ::  (Double ->  Double ->  DynamicPlottable 
10541068continFnPlot f =  def
10551069             &  relevantRange_y .~  otherDimDependence yRangef
1056-              &  isTintableMonochromic  .~   True 
1070+              &  autoTint 
10571071             &  axesNecessity .~  1 
10581072             &  dynamicPlot .~  plot
10591073 where  yRangef =  onInterval $  \ (l, r) ->  ((!% 0.1 ) &&&  (!% 0.9 )) .  sort .  pruneOutlyers
@@ -1114,7 +1128,7 @@ scrutiniseDiffability f = plot [{-plot fd, -}dframe 0.2, dframe 0.02]
11141128       fd =  alg f
11151129       fscrut =  analyseLocalBehaviour fd
11161130       dframe rfh =  def
1117-                  &  isTintableMonochromic  .~   True 
1131+                  &  autoTint 
11181132                 &  dynamicPlot .~  mkFrame
11191133        where  mkFrame (GraphWindowSpecR2 {.. }) =  case  fscrut xm of 
11201134                      Option  (Just  ((ym,y'm), δOδx²))
@@ -1275,7 +1289,7 @@ newtype ViewXCenter = ViewXCenter { getViewXCenter :: Double }
12751289instance  (Plottable  p ) =>  Plottable  (ViewXCenter  ->  p ) where 
12761290  plot f =  def &  relevantRange_y .~  OtherDimDependantRange 
12771291                     (\ g ->  deescalate relevantRange_y g .  plot .  f .  cxI =<<  g)
1278-                &  isTintableMonochromic  .~  fcxVoid^. isTintableMonochromic 
1292+                &  inherentColours  .~  fcxVoid^. inherentColours 
12791293               &  axesNecessity .~  fcxVoid^. axesNecessity
12801294               &  dynamicPlot .~  \ g ->  _dynamicPlot (plot .  f $  cx g) g
12811295    where  cx (GraphWindowSpecR2 {.. }) =  ViewXCenter  $  (lBound+ rBound)/ 2 
@@ -1288,7 +1302,7 @@ newtype ViewYCenter = ViewYCenter { getViewYCenter :: Double }
12881302instance  (Plottable  p ) =>  Plottable  (ViewYCenter  ->  p ) where 
12891303  plot f =  def &  relevantRange_x .~  OtherDimDependantRange 
12901304                     (\ g ->  deescalate relevantRange_x g .  plot .  f .  cyI =<<  g)
1291-                &  isTintableMonochromic  .~  fcyVoid^. isTintableMonochromic 
1305+                &  inherentColours  .~  fcyVoid^. inherentColours 
12921306               &  axesNecessity .~  fcyVoid^. axesNecessity
12931307               &  dynamicPlot .~  \ g ->  _dynamicPlot (plot .  f $  cy g) g
12941308    where  cy (GraphWindowSpecR2 {.. }) =  ViewYCenter  $  (bBound+ tBound)/ 2 
@@ -1301,7 +1315,7 @@ newtype ViewWidth = ViewWidth { getViewWidth :: Double }
13011315instance  (Plottable  p ) =>  Plottable  (ViewWidth  ->  p ) where 
13021316  plot f =  def &  relevantRange_y .~  OtherDimDependantRange 
13031317                     (\ g ->  deescalate relevantRange_y g .  plot .  f .  wI =<<  g)
1304-                &  isTintableMonochromic  .~  fwVoid^. isTintableMonochromic 
1318+                &  inherentColours  .~  fwVoid^. inherentColours 
13051319               &  axesNecessity .~  fwVoid^. axesNecessity
13061320               &  dynamicPlot .~  \ g ->  _dynamicPlot (plot .  f $  w g) g
13071321    where  w (GraphWindowSpecR2 {.. }) =  ViewWidth  $  rBound -  lBound
@@ -1314,7 +1328,7 @@ newtype ViewHeight = ViewHeight { getViewHeight :: Double }
13141328instance  (Plottable  p ) =>  Plottable  (ViewHeight  ->  p ) where 
13151329  plot f =  def &  relevantRange_x .~  OtherDimDependantRange 
13161330                     (\ g ->  deescalate relevantRange_x g .  plot .  f .  hI =<<  g)
1317-                &  isTintableMonochromic  .~  fhVoid^. isTintableMonochromic 
1331+                &  inherentColours  .~  fhVoid^. inherentColours 
13181332               &  axesNecessity .~  fhVoid^. axesNecessity
13191333               &  dynamicPlot .~  \ g ->  _dynamicPlot (plot .  f $  h g) g
13201334    where  h (GraphWindowSpecR2 {.. }) =  ViewHeight  $  tBound -  bBound
0 commit comments