Real-time line plotter for generic data

Latest on Hackage:

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow to host generated Haddocks.

BSD3 licensed by Greg Horn

Plot-ho-matic (and Set-ho-matic)

Hackage Build Status

Plot-ho-matic is a GUI for high-performance real-time plotting with a convenient TreeView interface for selecting which elements to draw from a data structure. The focus is on ease of use, with optional advanced interfaces for more features.

Plot-ho-matic in action

The sister library Set-ho-matic is a GUI for editing haskell data and sending those changes to some running program. It can also query the program for it’s latest data and has save and load features.

Set-ho-matic in action

Both Plot-ho-matic and Set-ho-matic rely heavily on generic-accessors which uses GHC.Generics to create trees from haskell data.


See the hackage docs starting with the main PlotHo module for documentation. There is also an examples folder in the git repository.


“user error: out of memory” If you get this ^ error on OSX your cairo/pango/gtk may be linked to an XQuartz library. Add –extra-lib-dirs=/usr/local/lib (or wherever the correct libraries are) to your .cabal/config

== Special thanks to Chart and gtk2hs, which do all the heavy lifting.


  • add a diff button to setHo

  • “refresh” clears upstream version so you can see if you get a response

  • optional configuration data (SetHo)
  • configurable: allow disabling autocommit (SetHo)
  • configurable: how to show Double/Float (default is now ‘show’) (SetHo)
  • redraw plots upon resetting history (PlotHo)


  • make settings aware of message counter

  • newHistoryChannel’ can now take meta without data

  • set default xaxis types
  • move reset axis range buttons higher

  • Better error messages when the “impossible” happens :b
  • Also combine partial common prefixes for plot titles/legends
  • Replace the Plotter monad with a monomorphic (GADT) Channel type.
  • Major reorganization to trigger off of GHC runtime instead of GTK events
  • Require non-threaded RTS
  • Plot all channels on each graph

  • Fix a nasty space leak

  • Add option to remember the min/max ranges past the view window

  • Make title text smaller

  • Put scrolledWindow inside expander

  • Fix regression where signal selectors weren’t growing
  • rename {options -> opt, signals -> sig} to save space

  • smaller minimum plot size
  • use correct gtk column packing function

  • code cleanup
  • use Gtk draw signal instead of expose signal (fixes buggy behavior)
  • more understandable and maintainable concurrency strategy
  • change default max history length to 500

  • initial settings selector box is big enough to see some fields
  • combo box and text entry now share “staged” column

  • Add autocommit toggle
  • Add “take upstream” button
  • Implemented saving/loading files

  • workaround issue where toggling expander hides the plot

  • generic-accessors compatibility
  • rewrite settings app to use dynamic data
  • upgrade to GTK3

  • Switch from Tree ([String], String, Maybe (a -> [[(Double, Double)]])) to Tree ([String], Either String (a -> [[(Double, Double)]]))

  • Make the list of channels a scrollable thing.

  • Better legend and title.

  • Compatability with generic-accessors 0.2

  • Performance improvement

  • Hierarchical visibility clicking and inconsistent state
  • Merge new signal tree with old

  • Use Accessors from generic-accessors package
  • Major performance improvements (only draw new data)
  • Both “history” and custom plot interfaces
  • Unify this package with the dynobud plotter

remove Generic requirement for some Lookup instances


  • Performance improvements
  • Safer monadic API
  • More general plottable types

0.3 (Unreleased development version)

  • switch from Template Haskell to GHC.Generics


  • Cleaner API


  • Initial release (moved from rawesome repo)
comments powered byDisqus