The standard RC parameters handling in Matplotlib has always troubled me. The 
syntax rc('figure.subplot', top=0.9) is not very conveniet if one wants to 
change a singe property. Direct rcParams['figure.subplot.top'] seems better 
suited in this case.

However, as the dots are already used to indicate grouping in RC, it seems 
very natural to use the syntax like:

rc.figure.subplot.top = 0.9

In my opinion this is very elegant, efficient and much Pythonic approach.

In the attachment I include a path to the current git main repo, which enables 
this way of handling RC properties. I would appreciate very much if they were 
reviewed and included in the next release of Matplotlib (the patch is not 
particularly large).

Best regrds,
Maciek

-- 
Maciek Dems                             http://dems.art.pl/
>From a829a9d17f9c302e44309219b29855c9bafdacbd Mon Sep 17 00:00:00 2001
From: Maciek Dems <[email protected]>
Date: Tue, 10 Jul 2012 15:16:16 +0200
Subject: [PATCH] Added extended rc handling, enabling elegant Pythonic
 'rc.figure.subplot.left = 0.1' syntax.

---
 lib/matplotlib/__init__.py |   86 +++++++++++++++++++++++++++++++++++---------
 lib/matplotlib/pyplot.py   |    4 +--
 2 files changed, 70 insertions(+), 20 deletions(-)

diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py
index 5eb9e77..ffff61c 100644
--- a/lib/matplotlib/__init__.py
+++ b/lib/matplotlib/__init__.py
@@ -812,13 +812,39 @@ if rcParams['axes.formatter.use_locale']:
     import locale
     locale.setlocale(locale.LC_ALL, '')
 
-def rc(group, **kwargs):
+class _SubRc(object):
+    def __init__(self, group):
+        self.__dict__['_group'] = group
+
+    def __setattr__(self, attr, value):
+        name = _Rc.aliases.get(attr) or attr
+        key = self._group + '.' + name
+        if key not in rcParams:
+            raise KeyError('Unrecognized key "%s"' % key)
+        rcParams[key] = value
+
+    def __getattr__(self, attr):
+        name = _Rc.aliases.get(attr) or attr
+        newgroup = self._group + '.' + name
+        return _SubRc(newgroup)
+
+    def __repr__(self):
+	if self._group not in rcParams:
+            raise KeyError('Unrecognized key "%s"' % self._group)
+	return repr(rcParams[self._group])
+
+class _Rc(object):
     """
-    Set the current rc params.  Group is the grouping for the rc, eg.
-    for ``lines.linewidth`` the group is ``lines``, for
-    ``axes.facecolor``, the group is ``axes``, and so on.  Group may
-    also be a list or tuple of group names, eg. (*xtick*, *ytick*).
-    *kwargs* is a dictionary attribute name/value pairs, eg::
+    Set the current rc params.  There are two alternative ways of using
+    this object.  One is to call it like a function::
+
+      rc(group, **kwargs)
+
+    Group is the grouping for the rc, eg. for ``lines.linewidth``
+    the group is ``lines``, for ``axes.facecolor``, the group is ``axes``,
+    and so on.  Group may also be a list or tuple of group names,
+    eg. (*xtick*, *ytick*).  *kwargs* is a dictionary attribute name/value
+    pairs, eg::
 
       rc('lines', linewidth=2, color='r')
 
@@ -840,6 +866,7 @@ def rc(group, **kwargs):
     'ec'    'edgecolor'
     'mew'   'markeredgewidth'
     'aa'    'antialiased'
+    'sans'  'sans-serif'
     =====   =================
 
     Thus you could abbreviate the above rc command as::
@@ -860,6 +887,14 @@ def rc(group, **kwargs):
     This enables you to easily switch between several configurations.
     Use :func:`~matplotlib.pyplot.rcdefaults` to restore the default
     rc params after changes.
+
+    Another way of using this object is to use the Python syntax like::
+
+      rc.figure.subplot.top = 0.9
+
+    which is equivalent to::
+
+      rc('figure.subplot', top=0.9)
     """
 
     aliases = {
@@ -870,19 +905,36 @@ def rc(group, **kwargs):
         'ec'  : 'edgecolor',
         'mew' : 'markeredgewidth',
         'aa'  : 'antialiased',
-        }
+        'sans': 'sans-serif'
+    }
 
-    if is_string_like(group):
-        group = (group,)
-    for g in group:
-        for k,v in kwargs.iteritems():
-            name = aliases.get(k) or k
-            key = '%s.%s' % (g, name)
-            try:
+    def __call__(self, group, **kwargs):
+        if matplotlib.is_string_like(group):
+            group = (group,)
+        for g in group:
+            for k,v in kwargs.items():
+                name = _Rc.aliases.get(k) or k
+                key = '%s.%s' % (g, name)
+                if key not in rcParams:
+                    raise KeyError('Unrecognized key "%s" for group "%s" and name "%s"' %
+                                   (key, g, name))
                 rcParams[key] = v
-            except KeyError:
-                raise KeyError('Unrecognized key "%s" for group "%s" and name "%s"' %
-                               (key, g, name))
+
+    def __setattr__(self, attr, value):
+        key = _Rc.aliases.get(attr) or attr
+        if key not in rcParams:
+            raise KeyError('Unrecognized key "%s"' % key)
+        rcParams[key] = value
+
+    def __getattribute__(self, attr):
+        if attr[:2] != '__':
+            return _SubRc(attr)
+        else:
+            raise AttributeError
+
+rc = _Rc()
+_Rc.__name__ = 'rc'
+
 
 def rcdefaults():
     """
diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py
index a60b598..b6eadbe 100644
--- a/lib/matplotlib/pyplot.py
+++ b/lib/matplotlib/pyplot.py
@@ -189,9 +189,7 @@ def pause(interval):
 
 
 
[email protected]_dedent(matplotlib.rc)
-def rc(*args, **kwargs):
-    matplotlib.rc(*args, **kwargs)
+rc = matplotlib.rc
 
 @docstring.copy_dedent(matplotlib.rcdefaults)
 def rcdefaults():
-- 
1.7.9.5

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Matplotlib-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to