From: R H. <rha...@gm...> - 2014-07-21 09:38:59
|
On 20 July 2014 14:23, jamesramm <jam...@gm...> wrote: > We cannot stick with the 'standard' CSS syntax by necessity, simply because > the standard CSS selectors and properties are defined from HTML and do not > match with matplotlib. > I.E we want to select by artist type, which doesn't exist in HTML and use > properties such as linewidth. > I'm not sure what it is about CSS syntax that isn't up to the job. For example, SVG works with standard CSS syntax (see http://www.w3.org/TR/SVG/styling.html#StylingWithCSS). Perhaps we just have a different view of what constitutes CSS vs. HTML/SVG/whatever. The example in the SVG spec is: rect { fill: red; stroke: blue; stroke-width: 3 } But if we define the element name for a Line2D instance as "line2d" then CSS snippet could just become: line2d { stroke: blue; stroke-width: 3 } Sure, matplotlib doesn't define a genuine DOM, but I understand there is interest in moving to a model more like that. In which case, perhaps a good way to proceed in the meantime would be to have artists expose a DOM facade suitable for styling. (Perhaps even using SVG element conventions?) NB. matplotlib already uses pyparsing, so it would be pretty straightforward to knock together a parser for CSS (or whatever subset is needed). Or there are existing Python CSS parser libraries. > Qt - Pyside/PyQt ('QSS') > Mapnik ('CartoCSS') > PyGal supports stylesheets (don't know much about this library) > > If we don't use CSS then +1 for using some other standard. > As I say, an alternative could be simply using the ConfigParser > > > Richard Hattersley wrote > >> > >> Do you have ideas on how one or more stylesheets would be "attached" to > a > >> particular figure, etc? > >> > >> Regards, > >> Richard Hattersley > >> > > > b) Filtering artists > Another problem is that we would generally want to treat artists which are > solely for the construction of the Axes differently to those artists that > define a plot. I.E we might want to define Line2D as having the colour red, > but we want lines which compose the Axes to be black or grey. > My initial proposal is to develop stylesheets for artist primitives only. > But eventually we will want to style artist containers aswell. > The problem matplotlib has is that the properties for artist containers are > not uniform/intuitive. > It generally has a API where artists which are 'contained' by other artists > are set by calling properties...e.g. axes.set_ylabel(text = , etc...) > The DOM facade could help bridge the gap. For example, a "DOM" instance returned by an Axes object could pretend to have "text" element children. Styling those would route the style information back to the underlying Axes object. For example: text { font-size: 12pt; } axes text.ylabel { font-size: 10pt; } I would imagine setting stylesheets through the axes or figure methods > (axes.setStyleSheet() or figure.setStyleSheet()). Via figure would require > being able to differentiate between different axes - i.e. introducing the > 'container' level syntax I mentioned above. > > I would imagine that this would eventually replace rcparams to define the > default style. I would also like to see the default look of graphs moving > away from the very dated, 90's style MATLAB appearance! > That would be an excellent start. More complicated mechanisms can always be added later if necessary. Richard |