For what it is worth, we attacked this problem about four years ago at my
work.  We just implemented a simple formatter.  A locator can also be done
in a similar manner if that is desired.

This is not exactly is a perfect solution, but it worked really well for us.

class ScaledFormatter( ticker.Formatter ):
   """: Takes an exisiting formatter and scales the value by a specified
amount.
   """
   def __init__( self, scale, formatter ):
      """Initialize the scaled formatter.

      = INPUT VARIABLES
      - scale     The scale factor to apply to the values specified by the
                  other formatter.
      - formatter Another matplotlib formatter to use for formatting the
                  data labels.
      """
      self.scale = scale
      self.formatter = formatter

   def __call__( self, x, pos = None ):
      'Return the format for tick val x at position pos'
      # get the string form of the value
      valueStr = self.formatter( x, pos )

      if len(valueStr) == 0:
         return ''

      # remove the unicode hyphen
      valueStr = valueStr.replace( u'\u2212', '-' )

      # convert to a float
      value = float( valueStr )

      # now scale the value
      value *= self.scale

      # convert ot a Unicode string
      s = unicode( value )

      # add the unicode hyphen
      s.replace( '-', u'\u2212' )

      return s

   def set_locs( self, locs ):
      'Make sure the encompassed formatter get these set.'
      ticker.Formatter.set_locs( self, locs )
      self.formatter.set_locs( locs )

   def set_axis( self, axis ):
      'Make sure the encompassed formatter get these set.'
      ticker.Formatter.set_axis( self, axis )
      self.formatter.set_axis( axis )

   def set_view_interval( self, vmin, vmax ):
      'Make sure the encompassed formatter get these set.'
      ticker.Formatter.set_view_interval( self, vmin, vmax )
      self.formatter.set_view_interval( vmin, vmax )

   def set_data_interval( self, vmin, vmax ):
      'Make sure the encompassed formatter get these set.'
      ticker.Formatter.set_data_interval( self, vmin, vmax )
      self.formatter.set_data_interval( vmin, vmax )

   def set_bounds( self, vmin, vmax ):
      'Make sure the encompassed formatter get these set.'
      ticker.Formatter.set_bounds( self, vmin, vmax )
      self.formatter.set_bounds( vmin, vmax )


--James

> -----Original Message-----
> From: Thomas Caswell [mailto:tcasw...@gmail.com]
> Sent: Thursday, May 23, 2013 5:26 PM
> To: matplotlib-devel@lists.sourceforge.net
> Subject: [matplotlib-devel] adding second formatter/locater set to axes
> objects
> 
> A question I have seen go by twice on SO is how to add a tick marks to the
> top/right of a plot which are re-scaled version of the values on the
> bottom/lefit axis (ex km/h on the left and mph on the right).  My
> understanding of the best way to do this is to use twin* and then keep the
> range of the two axes in sync by hand.
> 
> I am proposing adding at set of alternate formatters/locators to the
`axis`
> objects which if they exist are used for the top/right labels.
> Before I dive too deep into this, I want to check that a) there isn't a
better
> way to do this that I do not know and b) if this sounds like a reasonable
> approach.
> 
> Tom
> 
> --
> Thomas Caswell
> tcasw...@gmail.com
> 
>
----------------------------------------------------------------------------
--
> Try New Relic Now & We'll Send You this Cool Shirt New Relic is the only
SaaS-
> based application performance monitoring service that delivers powerful
full
> stack analytics. Optimize and monitor your browser, app, & servers with
just
> a few lines of code. Try New Relic and get this awesome Nerd Life shirt!
> http://p.sf.net/sfu/newrelic_d2d_may
> _______________________________________________
> Matplotlib-devel mailing list
> Matplotlib-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel


------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to