Hello list,
Hello Thorsten,

On Wednesday 09 January 2008 11:38, Thorsten Kranz wrote:
> I have a question concerning reformatting of axis-ticks via the
> FuncFormatter-class. In german, it's common to use a comma as separator for
> decimal numbers instead of a dot. To realize it in matplotlib, I do
> something like
>
> >from matplotlib.ticker import FuncFormatter
>
> import pylab
> pylab.figure()
> formatter = FuncFormatter(lambda x,pos: ("%.2f"%x).replace(".",","))
> ax = pylab.axes()
> ax.xaxis.set_major_formatter(formatter)
> ax.yaxis.set_major_formatter(formatter)
> ax.plot(pylab.arange(0,1,0.1),pylab.arange(0,1,0.1))
> This works fine for me, 

I had the same idea ;-). The problem is that you have a fixed number of digits 
behind the comma, which is not the desirable behaviour during zoom.
I changed the ticker.py/ axes.py files to circumwait this disadvantage. I 
attached a patch showing my changes and maybe somebody can test it. 
You can activate it using:
  ax.ticklabel_format(style='comma') 
for an ScalarFormatter

> but I encounter a problem when I do an 
> imshow-command with a colorbar. In the imshow-axes, it's o.k., but for the
> colorbar it doesn't really work. I do
>
> cb = pylab.colorbar()
> cb.ax.yaxis.set_major_formatter(formatter)
>
> and, actually, all dots are replaced by com9mata, but the values are also
> changed! E.g. instead of the old values (without formatter) from 0-0.54,
> the
>
> values are increased to 0-0.95. 
[...]
> Can anyone explain why it doesn't work out as I expect it to work? 
I don't know were the problem comes from. I attached your example in a slitly 
modified version and this shows that the problem is not due to your special 
formatting. It occurs with matplotlib.ticker.ScalarFormatter, too.

best regards,
Matthias

> Or is there a better, more standard way to substitute the dots by commata?
>
> Thanks,
> Thorsten
Index: ticker.py
===================================================================
--- ticker.py	(revision 4805)
+++ ticker.py	(working copy)
@@ -272,13 +272,15 @@
     such that the tick labels are meaningful. Scientific notation is used for
     data < 1e-3 or data >= 1e4.
     """
-    def __init__(self, useOffset=True, useMathText=False):
+    def __init__(self, useOffset=True, useMathText=False, useComma=False):
         # useOffset allows plotting small data ranges with large offsets:
         # for example: [1+1e-9,1+2e-9,1+3e-9]
         # useMathText will render the offset and scientific notation in mathtext
+        # useComma leads to comma (',') as decimal separator
         self._useOffset = useOffset
         self._usetex = rcParams['text.usetex']
         self._useMathText = useMathText
+        self._useComma = useComma
         self.offset = 0
         self.orderOfMagnitude = 0
         self.format = ''
@@ -327,11 +329,17 @@
             if self.offset:
                 offsetStr = self.format_data(self.offset)
                 if self.offset > 0: offsetStr = '+' + offsetStr
+                if self._useComma:
+                    if self._usetex:
+                        offsetStr = offsetStr.replace('.','{,}')
+                    else:
+                        offsetStr = offsetStr.replace('.',',')
             if self.orderOfMagnitude:
                 if self._usetex or self._useMathText:
                     sciNotStr = r'{\times}'+self.format_data(10**self.orderOfMagnitude)
                 else:
                     sciNotStr = u'\xd7'+'1e%d'% self.orderOfMagnitude
+            
             if self._useMathText:
                 return ''.join(('$\mathdefault{',sciNotStr,offsetStr,'}$'))
             elif self._usetex:
@@ -406,7 +414,13 @@
     def pprint_val(self, x):
         xp = (x-self.offset)/10**self.orderOfMagnitude
         if npy.absolute(xp) < 1e-8: xp = 0
-        return self.format % xp
+        if self._useComma:
+            if self._usetex:
+                return (self.format % xp).replace('.','{,}')
+            else:
+                return (self.format % xp).replace('.',',')
+        else:
+            return self.format % xp
 
     def _formatSciNotation(self, s):
         # transform 1e+004 into 1e4, for example
Index: axes.py
===================================================================
--- axes.py	(revision 4805)
+++ axes.py	(working copy)
@@ -1438,8 +1438,9 @@
         used by default for linear axes.
 
         kwargs:
-            style = 'sci' (or 'scientific') or 'plain';
-                        plain turns off scientific notation
+            style = 'sci' (or 'scientific') or 'plain' or 'comma';
+                        plain/comma turns off scientific notation
+                        comma enables decimal seperator ','
             axis = 'x', 'y', or 'both'
 
         Only the major ticks are affected.
@@ -1452,15 +1453,13 @@
         """
         style = kwargs.pop('style', '').lower()
         axis = kwargs.pop('axis', 'both').lower()
+        cb = False
         if style[:3] == 'sci':
             sb = True
         elif style in ['plain', 'comma']:
             sb = False
-            if style == 'plain':
-                cb = False
-            else:
+            if style == 'comma':
                 cb = True
-                raise NotImplementedError, "comma style remains to be added"
         elif style == '':
             sb = None
         else:
@@ -1468,8 +1467,10 @@
         if sb is not None:
             if axis == 'both' or axis == 'x':
                 self.xaxis.major.formatter.set_scientific(sb)
+                self.xaxis.major.formatter._useComma = cb
             if axis == 'both' or axis == 'y':
                 self.yaxis.major.formatter.set_scientific(sb)
+                self.yaxis.major.formatter._useComma = cb
 
     def set_axis_off(self):
         """

Attachment: example_of_thorsten_kranz.py
Description: application/python

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to