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.2
+version:             0.4.3
 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.
                      
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
@@ -126,25 +126,38 @@
 
 module Graphics.Rendering.Plot.Light (
   -- * Plot types
+  -- ** 1D plot
+  plotFun, Plot1DOptions(..),
   -- ** Heatmap
   heatmap, heatmap', plotFun2, colourBar,
   -- ** Scatter
   scatter, scatterLP, scatterLPBar, ScatterPointData(..), GlyphShape_(..),
   -- * Plot elements
   -- ** Geometric primitives
-  rect, rectCentered, squareCentered, circle, line, text, polyline, filledPolyline, pixel, pixel', 
+  -- *** Rectangle, square
+  rect, rectCentered, squareCentered,
+  -- *** Circle
+  circle,
+  -- *** Line
+  line,
+  -- *** Text
+  text, TextAnchor_(..), 
+  -- *** Polyline
+  polyline, filledPolyline, StrokeLineJoin_(..), 
+  -- *** Pixel
+  pixel, pixel', 
   -- ** Composite plot elements
-  filledBand, candlestick,
+  filledBand, candlestick, histogram,
   -- ** Plot utilities
   axes, toPlot, FigureData(..),
   -- ** Element attributes
-  LineStroke_(..), StrokeLineJoin_(..), TextAnchor_(..), LegendPosition_(..),
+  LineStroke_(..), LegendPosition_(..),
   -- ** Operations on frames
   frameFromPoints, frameFromFigData, mkFrame, mkFrameOrigin, width, height, figFWidth, figFHeight,  
   -- ** Colour utilities
   blendTwo, palette, pickColour,
   -- *** ShapeCol-related
-  ShapeCol(..), Col(..),
+  ShapeCol(..), Col(..), shapeColNoBorder, shapeColNoFill, shapeColBoth,
   -- ** TimeSeries utilities
   fromTick, toTick,
   -- ** SVG utilities
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
@@ -10,10 +10,24 @@
     -- * LabeledPoint
   , LabeledPoint(..), mkLabeledPoint, labelPoint, mapLabel, Axis(..), axes, meshGrid, subdivSegment,
     -- * SVG elements
-    svgHeader, rect, rectCentered, squareCentered, circle, line, tick, ticks, axis, toPlot, text, pixel, pixel', pickColour, colourBar, legendBar, plusGlyph, crossGlyph, polyline, filledPolyline, filledBand, candlestick, strokeLineJoin, LineStroke_(..), StrokeLineJoin_(..), TextAnchor_(..), LegendPosition_(..)
+    svgHeader, toPlot,
+    -- ** Rectangle/square
+    rect, rectCentered, rectCenteredMidpointBase, squareCentered,
+    -- ** Circle
+    circle,
+    -- ** Lines
+    line, tick, ticks, axis,
+    -- ** Polylines
+    polyline, filledPolyline, filledBand, strokeLineJoin, LineStroke_(..), StrokeLineJoin_(..),
+    -- ** Text
+    text, TextAnchor_(..), 
+    -- ** Specialized plot elements
+    pixel, pixel', plusGlyph, crossGlyph, candlestick, 
+    -- ** Plot legend
+    pickColour, colourBar, legendBar, LegendPosition_(..), 
     -- * Geometry
     -- ** R^2 Vectors
-  , V2(..), e1, e2, norm2, normalize2, v2fromEndpoints, v2fromPoint, (-.), pointRange
+    V2(..), e1, e2, norm2, normalize2, v2fromEndpoints, v2fromPoint, (-.), pointRange
     -- ** R^2 -> R^2 Matrices
   , Mat2(..), DiagMat2(..), diagMat2
     -- ** Typeclasses
@@ -105,9 +119,11 @@
 
 -- | A Col is both a 'Colour' and an alpha (opacity) coefficient
 data Col a = Col {
-    cColour :: C.Colour Double
-  , cAlpha :: a } deriving (Eq, Show)
+    cColour :: C.Colour Double  -- ^ Colour
+  , cAlpha :: a                 -- ^ Opacity, [0 .. 1]
+  } deriving (Eq, Show)
 
+-- | 'Col' constructor
 col :: C.Colour Double -> a -> Col a
 col = Col
 
@@ -126,12 +142,15 @@
   | BothCol (Col a) (Col a) a -- ^ Fill and border colours
   deriving (Eq, Show)
 
+-- | Construct a 'ShapeCol' for shapes that have no border stroke (i.e. have only the fill colour)
 shapeColNoBorder :: C.Colour Double -> a -> ShapeCol a
 shapeColNoBorder c a = NoBorderCol $ col c a
 
+-- | Construct a 'ShapeCol' for shapes that have no fill colour (i.e. have only the stroke colour)
 shapeColNoFill :: C.Colour Double -> a -> a -> ShapeCol a
 shapeColNoFill c a = NoFillCol $ col c a 
 
+-- | Construct a 'ShapeCol' for shapes that have both fill and stroke colour
 shapeColBoth ::
      C.Colour Double  -- ^ Fill colour
   -> C.Colour Double  -- ^ Stroke colour
@@ -186,7 +205,19 @@
     x0c = x0 - (wid / 2)
     y0c = y0 - (hei / 2)   
 
+-- | A rectangle, defined by the coordinates of the midpoint of its base
+rectCenteredMidpointBase :: (Show a, RealFrac a) =>
+     a                       -- ^ Width
+  -> a                       -- ^ Height
+  -> ShapeCol a              -- ^ Colour and alpha information
+  -> Point a                 -- ^ Base midpoint coordinates     
+  -> Svg
+rectCenteredMidpointBase wid hei col (Point x0 y0) =
+  rect wid hei col p' where
+    p' = Point x0c y0
+    x0c = x0 - (wid / 2)
 
+
 -- | A square, defined by its center coordinates and side length
 --
 -- > > putStrLn $ renderSvg $ squareCentered 30 (shapeColBoth C.blue C.red 1 5) (Point 20 30)
@@ -530,6 +561,9 @@
 
 
 
+
+
+
 -- | A filled polyline
 --
 -- > > putStrLn $ renderSvg $ filledPolyline C.coral 0.3 [(Point 0 1), (Point 10 40), Point 34 50, Point 30 5]
@@ -649,21 +683,28 @@
 
 
 
-
+-- | A 'pixel' is a filled square shape used for populating 'heatmap' plots , coloured from a palette
 pixel :: (Show a, RealFrac a) =>
          [C.Colour Double]         -- ^ Palette
       -> a                         -- ^ Width
       -> a                         -- ^ Height
-      -> Scientific          
-      -> Scientific
+      -> Scientific                -- ^ Function minimum
+      -> Scientific               -- ^ Function maximum
       -> LabeledPoint Scientific a
       -> Svg
 pixel pal w h vmin vmax (LabeledPoint p l) = rect w h col p where
   col = pickColour pal (toFloat vmin) (toFloat vmax) (toFloat l)
 
+-- | A 'pixel'' is a filled square shape used for populating 'heatmap' plots , coloured from a palette
 pixel'
   :: (Show a, RealFrac a, RealFrac t) =>
-     [C.Colour Double] -> a -> a -> t -> t -> LabeledPoint t a -> Svg
+     [C.Colour Double]  -- ^ Palette
+  -> a                  -- ^ Width 
+  -> a -- ^ Height
+  -> t -- ^ Function minimum 
+  -> t -- ^ Function maximum
+  -> LabeledPoint t a
+  -> Svg
 pixel' pal w h vmin vmax (LabeledPoint p l) = rect w h col p where
   col = pickColour pal vmin vmax l
   
diff --git a/src/Graphics/Rendering/Plot/Light/PlotTypes/Histogram.hs b/src/Graphics/Rendering/Plot/Light/PlotTypes/Histogram.hs
--- a/src/Graphics/Rendering/Plot/Light/PlotTypes/Histogram.hs
+++ b/src/Graphics/Rendering/Plot/Light/PlotTypes/Histogram.hs
@@ -1,10 +1,13 @@
 {-# language FlexibleContexts #-}
-module Graphics.Rendering.Plot.Light.PlotTypes.Histogram where
+module Graphics.Rendering.Plot.Light.PlotTypes.Histogram (histogram) where
 
 import Graphics.Rendering.Plot.Light.Internal
 
 import Control.Monad (forM_)
--- import Text.Blaze.Svg
+
+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
@@ -17,18 +20,40 @@
 import qualified Data.Vector.Unboxed as VU
 import qualified Data.Vector.Generic as VG
 
--- histogram figdata =
-  
- 
+import qualified Data.Text as T
+import qualified Data.Text.IO as T
 
 
 
-histogram col h = undefined where
-  (binCenters, binCounts) = unzip $ H.asList h
-  binXOffset = - head binCenters + 0.5 * binSize
-  binSize = H.binSize $ H.bins h
-  -- hcol = case col of
-  --   NoBorderCol c a 
+xPlot = 400
+yPlot = 300
+fnameOut = "data/histogram-1.svg"
+
+dats = [46,30,4,7,73,12,23,90,34,24,5,6,12,3,55,61]
+
+main = do
+  let
+    kol = shapeColNoBorder C.red 1
+    svg_t = svgHeader xPlot yPlot $ histogram kol 5 dats
+  T.writeFile fnameOut $ T.pack $ renderSvg svg_t
+
+
+
+
+histogram :: Foldable v =>
+             ShapeCol Double -- ^ Colour information (fill, stroke, opacity)
+          -> Int             -- ^ Number of histogram bins
+          -> v Double        -- ^ Data
+          -> Svg
+histogram col nBins dats = forM_ pshs $ \(p, h) -> rectCenteredMidpointBase binW (hMult * h) col p where
+  his = histo nBins dats
+  p1 = Point (head binCenters) 0
+  p2 = Point (last binCenters) 0
+  ps = pointRange nBins p1 p2
+  pshs = zip ps binCounts 
+  (binCenters, binCounts) = unzip $ H.asList his
+  binW = H.binSize $ H.bins his  -- bin width
+  hMult = 10 -- height multiplication coeff. (hack)
 
 
 
diff --git a/src/Graphics/Rendering/Plot/Light/PlotTypes/Plot1D.hs b/src/Graphics/Rendering/Plot/Light/PlotTypes/Plot1D.hs
--- a/src/Graphics/Rendering/Plot/Light/PlotTypes/Plot1D.hs
+++ b/src/Graphics/Rendering/Plot/Light/PlotTypes/Plot1D.hs
@@ -1,6 +1,52 @@
-module Graphics.Rendering.Plot.Light.PlotTypes.Plot1D (plotFun) where
+module Graphics.Rendering.Plot.Light.PlotTypes.Plot1D (
+    plotFun, Plot1DOptions(..)
+  , plotf, plotf'
+  , Plot1DDomain(..)
+  , plot, plot'
+  ) where
 
 import Graphics.Rendering.Plot.Light.Internal
+import qualified Data.Colour as C
+import qualified Data.Colour.Names as C
+import Text.Blaze.Svg
 
+-- | Graph a 1D function
+plotFun :: Functor f => (t -> t) -> f (Point t) -> f (Point t)
 plotFun f = fmap f' where
-  f' p@(Point x _) = LabeledPoint p (f x)
+  f' (Point x _) = Point x (f x)
+
+-- | Plot the graph of a 1D function
+plotf :: (Show a, RealFrac a) => (a -> a) -> Svg
+plotf = plotf' plot1dDomainDefaults
+
+plotf' :: (Show a, RealFrac a) => Plot1DDomain a -> (a -> a) -> Svg
+plotf' (Plot1DDomain n x1 x2) f = plot $ plotFun f ps where
+  ps = pointRange n (Point x1 0) (Point x2 0)
+
+plot :: (Foldable t, Show a, RealFrac a) => t (Point a) -> Svg
+plot = plot' plot1DDefaults
+
+plot' :: (Foldable t, Show a, RealFrac a) =>
+         Plot1DOptions a
+      -> t (Point a)
+      -> Svg
+plot' (Plot1DOptions sw ty sjt sc) = polyline sw ty sjt sc 
+
+data Plot1DOptions a = Plot1DOptions {
+    p1oWidth :: a             -- ^ Stroke width
+  , p1oStrokeType :: LineStroke_ a   -- ^ Stroke type 
+  , p1oStrokeJoinType :: StrokeLineJoin_ -- ^ Stroke join type 
+  , p1oStrokeColour :: C.Colour Double -- ^ Stroke colour
+                                     } deriving (Eq, Show)
+
+plot1DDefaults :: RealFrac a => Plot1DOptions a
+plot1DDefaults = Plot1DOptions 3 Continuous Round C.blue
+
+data Plot1DDomain a = Plot1DDomain {
+    p1dNPoints :: Int
+  , p1dPoint1 :: a
+  , p1dPoint2 :: a
+                                   } deriving (Eq, Show)
+
+plot1dDomainDefaults :: RealFrac a => Plot1DDomain a
+plot1dDomainDefaults = Plot1DDomain 100 (-10) 10
