Commit a8d903dd authored by Philipp Gast's avatar Philipp Gast
Browse files

Merge branch 'dev' into 'Qt-backend'

# Conflicts:
#   __init__.py
#   config-default.py
parents 0f10c217 d780b035
......@@ -33,9 +33,17 @@
#
#
# IMPORT ---------------------------------------------------------------
from .config import INFO, WARN, SEVR, DBUG, SPCE
import os as os
import numpy as np
# Test mpl version:
from matplotlib import __version__ as mplvers
if int(mplvers.replace('.','')[:3]) < 143 :
print('\n\n' + WARN + 72*'=' + '\n' + SPCE + 'The matplotlib version you are using is not supported.\n' + SPCE + 'Most of myplotlib should work, but some stuff may not.\n' + SPCE + 'ex: expect an error with test203\n' + SPCE + 72*'=' + '\n\n')
# matplotlib
from matplotlib.pyplot import figure
from matplotlib.pyplot import rc
......@@ -56,7 +64,6 @@ G_RAWDATAS = {'current': MyData()} # raw data Object
_G_WINDOWS = []
# CONFIGURATION --------------------------------------------------------
from .config import INFO, WARN, SEVR, DBUG, SPCE
from .config import D_FIGNUM, D_FIGSIZE, D_REFORMAT, D_FORMATTED
from .config import D_RAWDATA, D_INPUTARG
from .config import D_IPATH
......@@ -80,6 +87,8 @@ elif rcParams['backend'] == u'WXAgg':
from .myWin_WXAgg import MyWin_WXAgg as MyWin
elif rcParams['backend'] == u'Qt4Agg':
from .myWin_Qt4Agg import MyWin_Qt4Agg as MyWin
elif rcParams['backend'] == u'MacOSX':
from .myWin_MacOSx import MyWin_MacOSx as MyWin
else:
print(SEVR + "The backend you choosed is not supported interactive mode not available")
......
......@@ -33,7 +33,7 @@
# IMPORT ---------------------------------------------------------------
from . import INFO, SPCE, DBUG
from . import myTest, testList
from . import __dict__
from .test import __dict__ as availTests
import sys
import getopt
......@@ -76,8 +76,8 @@ for opt, arg in opts:
tests = arg.split(', ')
testList = []
for test in tests:
if test in __dict__.keys():
testList.append(__dict__[test])
if test in availTests.keys():
testList.append(availTests[test])
if len(testList) == 0:
print(" > sevr-: you need to give valid tests to be tested.")
......
......@@ -28,7 +28,7 @@ D_OFORMAT = 'png' # default format for ouput
D_DEBUG = True # default debug value
# PLOTTING CONFIGURATION -----------------------------------------------
# BACKEND: u'TKAgg', u'GTKAgg', u'WXAgg', u'Qt4Agg'
# BACKEND: u'TKAgg', u'GTKAgg', u'WXAgg', u'Qt4Agg', u'MacOSX'
rcParams['backend'] = u'WXAgg'
# FONT
......
......@@ -114,8 +114,19 @@ class MyAxes(Axes):
# Because matplotlib.axes.update expect kwargs and not **kwargs ... (stupid!!)
if args: # catch matplotlib kwargs
kwargs = args[0]
kw_for_axes = {key: value for (key, value) in args[0].items() if key not in self.keywords}
# kw_for_axes = {key: value for (key, value) in args[0].items() if key not in self.keywords} # Not compatible with python2.6
kw_for_axes = {}
for (key, value) in args[0].items():
if key not in self.keywords:
kw_for_axes.update({key: value})
Axes.update(self, kw_for_axes) # update matplotlib.Axes
# myplotlib update
self.keywords.update({key: value for (key, value) in kwargs.items() if key in self.keywords})
# self.keywords.update({key: value for (key, value) in kwargs.items() if key in self.keywords}) # Not compatible with python2.6
for (key, value) in kwargs.items():
if key in self.keywords:
self.keywords.update({key: value})
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# ================= FILE HEADER ========================================
#
# myplotlib v3.0.1,
#
# @file myWin_TkAgg.py
# @author Yori 'AGy' Fournier
# @licence CC-BY-SA
#
# MyWin_TkAgg class: Overlay of matplotlib FigureManagerTkAgg
# class. It allows a cleaner and more confortable usage of windows
# with the TkAgg Backend.
#
# @Class MyWin_TkAgg
#
# @Constructor
#
# fig: the MyFig object that need to be drawn
# show: a flag to show the window just after
# creation. (default: True)
# fignum: number of both the Window and the Figure.
# debug: flag for debugging, more verbatile.
# (kw)args: user defined arguments and keywords.
#
# @section Functions
#
# - _boundFigure_: bound a figure to the window (priv.)
#
# - _unboundFigure_: unbound a figure to the window (priv.)
#
# - set_figure: a clean way of setting a new figure
# to the window.
#
# - refresh: redraw the window
# - clean the figure
# - plot the figure
# - draw the canvas
#
# - drawFigure: draw a given figure on the window
# - set the figure of needed
# - refresh
#
# - close: close the window
#
# @section History
#
# v 1.0.1 - MyWin_TkAgg class for the myplotlib module.
#
# ======================================================================
#
# IMPORT ---------------------------------------------------------------
from . import INFO, SEVR, WARN, DBUG, SPCE
from . import rcParams
from . import _G_WINDOWS
from . import np
# For the backend
from matplotlib.backends.backend_macosx import FigureManagerMac, FigureCanvasMac
# Test mpl version:
from matplotlib import __version__ as mplvers
if int(mplvers.replace('.','')[:3]) < 150 :
import six
from six.moves import tkinter as Tk
else :
from matplotlib.externals import six
from matplotlib.externals.six.moves import tkinter as Tk
# Class MyWin Overwriting the disgusting Matplotlib.FigureManager class
class MyWin_MacOSx(FigureManagerMac):
# CONSTRUCTOR ------------------------------------------------------
def __init__(self, fig, show=True, *args, **kwargs):
# set the dpi to 75 (correct value for screen)
if(fig.dpi != 75.):
fig.dpi = 75.
# Get the debug value
debug = kwargs.get('debug', False)
# Get the user specified ID of the window or set it to 0
if 'fignum' in kwargs.keys():
num = kwargs['fignum']
fignumSpecifiedByUser = True
else:
num = 0
fignumSpecifiedByUser = False
# if ID already used
if(num in [(window.num) for window in _G_WINDOWS]):
# if user specified fignum then close former window and create new one
if(fignumSpecifiedByUser):
if(debug):
print(DBUG + "The fignum you specified already exists, I'll close the former window")
# Close the window with the specified number
_G_WINDOWS[np.where([(window.num == num) for window in _G_WINDOWS])[0][0]].close()
else:
# If user didn't specified a fignum
# increase ID until found a free one
while(num in [(window.num) for window in _G_WINDOWS]):
num = num + 1
# If debug print the ID of the window
if(debug):
print(DBUG + "You choosed num = " + str(num))
# before creating anything verify that the fig is not already
# bounded to another window
if fig.boundedToWin:
# if it is the case close the bounded window.
win = _G_WINDOWS[np.where([(window.num == fig.fignum) for window in _G_WINDOWS])[0][0]]
win.close()
# Call FigureManagerTkAgg class
# (already wondering if this is not a mistake...)
if(debug):
print(INFO + "Used MacOSx backend")
# create the canvas
canvas = FigureCanvasMac(fig)
# create the Figure manager (what we call window)
FigureManagerMac.__init__(self, canvas, num)
# bound the figure to the window
self.canvas.figure.boundedToWin = True
self.canvas.figure.fignum = num
# add the window in the global variable _G_WINDOWS
# this guarenty that you never loose a window
# (see myTool.py getWindow(num))
_G_WINDOWS.append(self)
# if show is on, then show the window
if show:
self.refresh()
self.show()
# BOUND ------------------------------------------------------------
def _boundFigure_(self, fig):
fig.canvas = self.canvas
self.canvas.figure = fig
self.canvas.figure.boundedToWin = True
self.canvas.figure.fignum = self.num
# UNBOUND ----------------------------------------------------------
def _unboundFigure_(self):
self.canvas.figure.boundedToWin = False
self.canvas.figure.fignum = -1
# SETTERS ----------------------------------------------------------
# SET FIGURE -------------------------------------------------------
def set_figure(self, fig):
# first unbound the former figure
self._unboundFigure_()
# if the new figure is already bounded close
# its former container.
if fig.boundedToWin:
win = _G_WINDOWS[np.where([(window.num == fig.fignum) for window in _G_WINDOWS])[0][0]]
win.close()
# bound the new figure
self._boundFigure_(fig)
# REFRESH ----------------------------------------------------------
def refresh(self):
# in the case the figure got another canvas
# rebound the figure. This situation should not happend!!
if self.canvas != self.canvas.figure.canvas:
print(WARN + "Something weird happend, the canvas of the figure have been changed")
self.set_figure(self.canvas.figure)
# refresh
self.canvas.figure.plot()
self.canvas.draw()
return(True)
# DRAW -------------------------------------------------------------
def drawFigure(self, fig):
# if the figure is not the current one
if(fig.fignum != self.num):
# cleanly set the new figure
self.set_figure(fig)
# and refresh
self.refresh()
# CLOSE ------------------------------------------------------------
def close(self):
self._unboundFigure_()
self.destroy()
del _G_WINDOWS[np.where([(window == self) for window in _G_WINDOWS])[0][0]]
# remark if you create the window like:
# win = MyWin(fig)
# then win is still refering the self
# and therefore not yet freed
# del win would free it entirely.
# Import --------------------------------------------------------------
from .. import MyAxes
from .. import numpy as np
from .. import INFO, WARN, SEVR, DBUG, SPCE
# Default values ------------------------------------------------------
_D_ANNOT = "right" # ("right","left","top","bottom",)
# CLASS AxColorBar --------------------------------------------------
class AxColorBar(MyAxes):
# WARNING : because this class is derived from another the keywords of this have to remain untouched
def declareKeywords(self):
self.__class__.__bases__[-1].declareKeywords(self) # crazyness !!!!
self.keywords.update({
'annotation' : _D_ANNOT
})
def bar(self,orientation,levels) :
if type(orientation) == type(str()):
if "vertical".startswith(orientation) :
x = np.array([0, 1])
y = levels
X,Y = np.meshgrid(x, y)
Z = np.array([y,y]).T
elif "horizontal".startswith(orientation):
x = levels
y = np.array([0, 1])
X,Y = np.meshgrid(x, y)
Z = np.array([x,x])
else :
print("orienation not known")
raise UserWarning
else :
print("wrong input type")
raise UserWarning
return X,Y,Z
# Plotting function -------------------------------------------------
def plotting(self):
dmin = self.info4colorBar['min']
dmax = self.info4colorBar['max']
norm = self.info4colorBar['norm']
label = self.info4colorBar['label']
annot = self.keywords["annotation"]
debug = self.fig.debug
if norm == 'lin' :
levels = np.linspace(dmin, dmax, num=100)
elif norm == 'log' :
levels = np.logspace(np.log10(dmin), np.log10(dmax), num=100)
from matplotlib.colors import LogNorm
if annot == "right" :
if(debug): print(DBUG + "Annotation ",annot)
# position
self.yaxis.tick_right()
self.yaxis.set_label_position("right")
if (norm == "lin") :
self.set_yscale("linear", nonposx='clip')
else :
self.set_yscale(norm, nonposx='clip')
# label text
self.xaxis.set_label_text(None)
self.yaxis.set_label_text(label)
# axis visibility
self.xaxis.set_visible(False)
self.yaxis.set_visible(True)
X,Y,Z = self.bar("vert",levels)
elif annot == "left" :
if(debug): print(DBUG + "Annotation ",annot)
# position
self.yaxis.tick_left()
self.yaxis.set_label_position("left")
if (norm == "lin") :
self.set_yscale("linear", nonposx='clip')
else :
self.set_yscale(norm, nonposx='clip')
# label text
self.xaxis.set_label_text(None)
self.yaxis.set_label_text(label)
# axis visibility
self.xaxis.set_visible(False)
self.yaxis.set_visible(True)
X,Y,Z = self.bar("vert",levels)
elif annot == "top" :
# http://stackoverflow.com/questions/14406214/moving-x-axis-to-the-top-of-a-plot-in-matplotlib
if(debug): print(DBUG + "Annotation ",annot)
# position
self.xaxis.tick_top()
self.xaxis.set_label_position("top")
if (norm == "lin") :
self.set_xscale("linear", nonposx='clip')
else :
self.set_xscale(norm, nonposx='clip')
# label text
self.xaxis.set_label_text(label)
self.yaxis.set_label_text(None)
# axis visibility
self.xaxis.set_visible(True)
self.yaxis.set_visible(False)
X,Y,Z = self.bar("horizontal",levels)
elif annot == "bottom" :
if(debug): print(DBUG + "Annotation ",annot)
# position
self.xaxis.tick_bottom()
self.xaxis.set_label_position("bottom")
if (norm == "lin") :
self.set_xscale("linear", nonposx='clip')
else :
self.set_xscale(norm, nonposx='clip')
# label text
self.xaxis.set_label_text(label)
self.yaxis.set_label_text(None)
# axis visibility
self.xaxis.set_visible(True)
self.yaxis.set_visible(False)
X,Y,Z = self.bar("horizontal",levels)
else :
print("Key annotation has no known value")
raise UserWarning
#~ self.ticklabel_format(axis='y', style='sci', scilimits=(-2, 2))
if(debug): print(DBUG + "Currently plotting AxColorScale...")
if norm == 'lin' :
self.pcolormesh(X, Y, Z )
elif norm == 'log' :
self.pcolormesh(X, Y, Z ,norm=LogNorm())
# removes white borders around the plot. This is nessessary because MPL likes to clip to round numbers
self.axis('tight')
return(True)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment