diff --git a/doc/fig/scatter-2.png b/doc/fig/scatter-2.png
new file mode 100644
Binary files /dev/null and b/doc/fig/scatter-2.png differ
diff --git a/doc/fig/scatter.png b/doc/fig/scatter.png
deleted file mode 100644
Binary files a/doc/fig/scatter.png and /dev/null differ
diff --git a/plot-light.cabal b/plot-light.cabal
--- a/plot-light.cabal
+++ b/plot-light.cabal
@@ -1,5 +1,5 @@
 name:                plot-light
-version:             0.4
+version:             0.4.1
 synopsis:            A lightweight plotting library, exporting to SVG
 description:         This library provides drawing and plotting datastructures and functions; it is aimed in particular at scientific visualization, but it also exposes its plotting primitives and a small but general purpose 2D geometry library.
                      
@@ -14,7 +14,7 @@
 extra-source-files:  README.md
                      CHANGELOG.md
 extra-doc-files:     doc/fig/heatmap.png
-                     doc/fig/scatter.png
+                     doc/fig/scatter-2.png
 cabal-version:       >=1.18
 tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1, GHC == 8.4.2
 
diff --git a/src/Graphics/Rendering/Plot/Light.hs b/src/Graphics/Rendering/Plot/Light.hs
--- a/src/Graphics/Rendering/Plot/Light.hs
+++ b/src/Graphics/Rendering/Plot/Light.hs
@@ -38,11 +38,12 @@
 --
 -- > xPlot = 400
 -- > yPlot = 300
--- >
+-- > fnameOut = "heatmap.svg"
+-- 
 -- > fdat = FigureData xPlot yPlot 0.1 0.8 0.1 0.9 10
--- >
+-- 
 -- > palette0 = palette [C.red, C.white, C.blue] 15
--- > 
+-- 
 -- > plotFun2ex1 = do
 -- >  let 
 -- >    p1 = Point (-2) (-2)
@@ -64,7 +65,7 @@
 -- >       axes fdat frame 2 C.black 10 10
 -- >       pixels
 -- >       cbar
--- >  T.writeFile "heatmap.svg" $ T.pack $ renderSvg svg_t
+-- >  T.writeFile fnameOut $ T.pack $ renderSvg svg_t
 --
 -- This example demonstrates how to plot a 2D scalar function and write the output to SVG file.
 --
@@ -83,46 +84,45 @@
 --
 -- === 2. Scatter plot of 3D data
 --
--- <<doc/fig/scatter.png>>
+-- <<doc/fig/scatter-2.png>>
 --
 -- This example shows how to plot a collection of labelled points in the plane. Each sample row is represented by a `LabeledPoint`, in which the label is a scalar quantity.
 --
--- The `scatterLP` function renders each data row as a glyph, by modifying a `ScatterPointData` record of default values via three functions that control the glyph size, contour line thickness and colour. This functionality can be exploited in creative ways to achieve effective infographics.
---
+-- The `scatterLP` function renders each data row as a glyph, by modifying a `ScatterPointData` record of default values via four functions that control the glyph size, contour line thickness, colour and opacity. This functionality can be exploited in creative ways to achieve effective infographics.
 --
 -- > xPlot = 400
 -- > yPlot = 300
--- > fnameOut = "data/scatter-1.svg"
--- >
+-- > fnameOut = "scatter.svg"
+--
 -- > fdat = FigureData xPlot yPlot 0.1 0.8 0.1 0.9 10
--- >
+--
 -- > dats = zipWith LabeledPoint p_ l_ where
 -- >   l_ = [-5, -4 .. ]
--- >   p_ = zipWith Point [4,7,12,23,90,34,24,5,6,12,3] [43,23,1,23,8,11,17,25,4,5]
--- >
--- > spdata = ScatterPointData Circle 3 3 C.red
--- >
--- >
+-- >   p_ = zipWith Point [46,30,4,7,73,12,23,90,34,24,5,6,12,3,55,61] [20,35,43,23,20,1,23,8,11,17,25,4,5,26, 30]
+--
+-- > spdata = ScatterPointData Plus 3 3 C.black 0.8
+-- 
+-- > main :: IO ()
 -- > main = do
--- >  let
--- >    frameTo = frameFromFigData fdat
--- >    frameFrom = frameFromPoints $ _lp <$> dats
--- >    vmin = minimum $ _lplabel <$> dats
--- >    vmax = maximum $ _lplabel <$> dats     
--- >    f l sz = 10/(1 + exp(-(0.3 * x)))
--- >      where x = l + sz
--- >    g _ w = w
--- >    h l col = C.blend l' C.blue col
--- >      where
--- >        l' = (l - vmin)/(vmax - vmin)
--- >    dats' = moveLabeledPointBwFrames frameFrom frameTo False True <$> dats
--- >    svg_t = svgHeader xPlot yPlot $ do
--- >      axes fdat frameFrom 2 C.black 10 10
--- >      scatterLP f g h spdata dats'
--- >      scatterLPBar fdat 50 vmin vmax 3 TopRight 100 f g h spdata
+-- >   let
+-- >     frameTo = frameFromFigData fdat
+-- >     frameFrom = frameFromPoints $ _lp <$> dats
+-- >     vmin = minimum $ _lplabel <$> dats
+-- >     vmax = maximum $ _lplabel <$> dats     
+-- >     f l sz = 15 / (1 + exp(- (0.3 * x)) )
+-- >       where x = l + sz
+-- >     g l w = w * (1 + l / (1 + abs l))
+-- >     h l col = C.blend l' C.red col
+-- >       where
+-- >         l' = (l - vmin)/(vmax - vmin)
+-- >     i l alp = alp * ( 1 + l / (1 + abs l))
+-- >     dats' = moveLabeledPointBwFrames frameFrom frameTo False True <$> dats
+-- >     svg_t = svgHeader xPlot yPlot $ do
+-- >       axes fdat frameFrom 2 C.black 10 10
+-- >       scatterLP f g h i spdata dats'
+-- >       scatterLPBar fdat 50 vmin vmax 3 TopRight 100 f g h i spdata
 -- >   T.writeFile fnameOut $ T.pack $ renderSvg svg_t
---
---
+-- 
 
 module Graphics.Rendering.Plot.Light (
   -- * Plot types
@@ -131,7 +131,7 @@
   -- ** Scatter
   scatter, scatterLP, scatterLPBar, ScatterPointData(..), GlyphShape_(..),
   -- * Plot elements
-  -- ** Geometrical primitives
+  -- ** Geometric primitives
   rect, rectCentered, squareCentered, circle, line, text, polyline, filledPolyline, pixel, pixel', 
   -- ** Composite plot elements
   filledBand, candlestick,
@@ -142,12 +142,19 @@
   -- ** Operations on frames
   frameFromPoints, frameFromFigData, mkFrame, mkFrameOrigin, width, height, figFWidth, figFHeight,  
   -- ** Colour utilities
-  blendTwo, palette, pickColour, 
+  blendTwo, palette, pickColour,
+  -- *** ShapeCol-related
+  ShapeCol(..), Col(..), 
   -- ** SVG utilities
   svgHeader, translateSvg, toSvgFrame, toSvgFrameLP,
-  -- * Types
-  Frame(..), Point(..), LabeledPoint(..), labelPoint, mapLabel, Axis(..),
-  -- ** Helpers
+  -- * Geometric types
+  -- ** Frame
+  Frame(..),
+  -- ** Point, LabeledPoint
+  Point(..), LabeledPoint(..), labelPoint, mapLabel,
+  -- ** Axis
+  Axis(..),
+  -- * Helpers
   meshGrid,
   -- *** Misc.
   toFloat, wholeDecimal
diff --git a/src/Graphics/Rendering/Plot/Light/Internal.hs b/src/Graphics/Rendering/Plot/Light/Internal.hs
--- a/src/Graphics/Rendering/Plot/Light/Internal.hs
+++ b/src/Graphics/Rendering/Plot/Light/Internal.hs
@@ -172,8 +172,8 @@
 
 -- | A rectangle, defined by its center coordinates and side lengths
 --
--- > > putStrLn $ renderSvg $ rectCentered 15 30 (Just C.blue) (Just C.red) (Point 20 30)
-
+-- > > putStrLn $ renderSvg $ rectCentered 15 30 (shapeColBoth C.blue C.red 1 5) (Point 20 30)
+-- > <rect x="12.5" y="15.0" width="15.0" height="30.0" fill-opacity="1.0" fill="#0000ff" stroke-opacity="1.0" stroke="#ff0000" stroke-width="5.0" />
 rectCentered :: (Show a, RealFrac a) =>
      a                       -- ^ Width
   -> a                       -- ^ Height
@@ -188,12 +188,14 @@
 
 
 -- | A square, defined by its center coordinates and side length
-squareCentered
-  :: (Show a, RealFrac a) =>
-     a                          -- ^ Side length
-     -> ShapeCol a              -- ^ Colour and alpha information
-     -> Point a                 -- ^ Center coordinates
-     -> Svg
+--
+-- > > putStrLn $ renderSvg $ squareCentered 30 (shapeColBoth C.blue C.red 1 5) (Point 20 30)
+-- > <rect x="5.0" y="15.0" width="30.0" height="30.0" fill-opacity="1.0" fill="#0000ff" stroke-opacity="1.0" stroke="#ff0000" stroke-width="5.0" />
+squareCentered :: (Show a, RealFrac a) =>
+                  a                          -- ^ Side length
+               -> ShapeCol a              -- ^ Colour and alpha information
+               -> Point a                 -- ^ Center coordinates
+               -> Svg
 squareCentered w = rectCentered w w
 
 lineColourDefault :: C.Colour Double
diff --git a/src/Graphics/Rendering/Plot/Light/PlotTypes/Scatter.hs b/src/Graphics/Rendering/Plot/Light/PlotTypes/Scatter.hs
--- a/src/Graphics/Rendering/Plot/Light/PlotTypes/Scatter.hs
+++ b/src/Graphics/Rendering/Plot/Light/PlotTypes/Scatter.hs
@@ -6,12 +6,15 @@
 import Data.Fixed
 import Data.Maybe (fromMaybe)
 import Control.Monad (forM_)
+
 import Text.Blaze.Svg
+import Text.Blaze.Svg.Renderer.String (renderSvg)
+
 import qualified Data.Colour as C
 -- import qualified Data.Colour.Palette.BrewerSet as CP
 import qualified Data.Colour.Names as C
 import qualified Data.Text as T
-
+import qualified Data.Text.IO as T
 
 -- | Scatter plot
 --
@@ -33,7 +36,7 @@
              (l -> b -> a)            -- ^ Modifies the glyph size
           -> (l -> b -> a)         -- ^ Modifies the glyph stroke width
           -> (l -> C.Colour Double -> C.Colour Double)  -- ^ Modifies the glyph colour
-          -> (l -> b -> a)
+          -> (l -> b -> a)        -- ^ Modifies the glyph opacity
           -> ScatterPointData b    -- ^ Glyph style defaults
           -> t (LabeledPoint l a) -- ^ Data
           -> Svg
@@ -80,11 +83,11 @@
 -- | Parameters for a scatterplot glyph
 data ScatterPointData a = ScatterPointData
   {
-    spGlyphShape :: GlyphShape_
-  , spSize :: a
-  , spStrokeWidth :: a
-  , spColour :: C.Colour Double
-  , spAlpha :: a
+    spGlyphShape :: GlyphShape_   -- ^ Glyph shape
+  , spSize :: a                   -- ^ Glyph size
+  , spStrokeWidth :: a            -- ^ Glyph stroke width
+  , spColour :: C.Colour Double   -- ^ Glyph colour
+  , spAlpha :: a                  -- ^ Glyph opacity
   } deriving (Eq, Show)
 
 
@@ -128,6 +131,19 @@
 -- -- | Utility function for cycling glyph colours and shapes (i.e. unique combinations of these make it easy to tell different datasets apart)
 -- cycleGlyphCols :: (CP.ColorCat, Int) -> Int -> [(CP.Kolor, GlyphShape_)]
 -- cycleGlyphCols (pal, n) nsets = take nsets $ zip (cycle $ CP.brewerSet pal n ) (cycle [Square, Circle ..])
+
+
+
+
+
+
+    
+
+
+
+
+
+
 
 
 
