# -*- coding: utf-8 *-*
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from copy import deepcopy
from diaGrabber import target, _utils
import sys
#import scipy
from ._plot import _plot
[docs]class matPlotLib(_plot):
def __init__(self, matrixClass, alt_plotMatrix = "", merge_index = []):
super(matPlotLib, self).__init__(matrixClass, alt_plotMatrix, merge_index)
self.fig = []
for m in range(len(self.merge_index)):
self.fig.append(plt.figure(figsize=(11, 8), dpi=80))
#set bg color
self.fig[-1].patch.set_facecolor('white')
#fig.patch.set_alpha(0.7)
[docs] def graph(self, title = ""):
if title != "":
plt.suptitle(title)
if self.nDim == 2:
XY,Z = self.matrixClass.transformMatrixToPoints()
for m in range(len(self.merge_index)):
ax1 = self.fig[m].add_subplot(111)
#3D
if self.nDim == 2:
#ax = self.fig.add_subplot(111, projection='3d')
ax = Axes3D(self.fig[m])
ax.set_xlabel(self._basis_dim[0].name)
ax.set_ylabel(self._basis_dim[1].name)
ax.plot_wireframe(XY[self.merge_index[m]][0],XY[self.merge_index[m]][1], Z[self.merge_index[m]])
##2D
elif self.nDim == 1:
ax1.set_ylabel(self._merge_dim[self.merge_index[m]].name)
ax1.set_xlabel(self._basis_dim[0].name)
#axis_values = self._getAxisValues()
#plt.xticks( range(self._basis_dim[0].resolution), axis_values[0])
ax1.plot(self.sortMatrix[0],self.matrix[self.merge_index[m]])
else:
sys.exit(NotImplemented)
#self._printPlotOverlay()
[docs] def heatMap(self, title = ""):
if self.matrixClass.nDim != 2:
sys.exit("ERROR: plotting heatmap work only for 2 basis_dim")
if title != "":
plt.suptitle(title)
self.ax = []
for m in range(len(self.merge_index)):
self.ax.append(self.fig[m].add_subplot(111))
data = self.matrix[self.merge_index[m]].transpose()
self.ax[-1].set_xlabel(self._basis_dim[0].name)
self.ax[-1].set_ylabel(self._basis_dim[1].name)
#axis_values = self._getAxisValues()
#plt.xticks( range(self._basis_dim[0].resolution), axis_values[0])
#plt.yticks( range(self._basis_dim[1].resolution), axis_values[1])
axis_range = self._getAxisRange()
#origing... Place the [0,0] index of the array in the upper left or lower left corner of the axes.
#extend ... transform px-positions to data-positions
image = self.ax[-1].imshow(data, origin='lower', aspect='auto', extent=axis_range)
image.set_interpolation('nearest')
cBar = self.fig[m].colorbar(image)
#cBar = image.colorbar()#colorbar(ticks=[min(data2[:,2]),max(data2[:,2])])
#cBar.set_ticks(['Low','High'])
cBar.set_label(self._merge_dim[m].name)
############################
###########################
###########################
##statt der px-positionen die wirktlichen positionen tracken
###so anpassen, dass es immer ins bild passt
self._printPlotOverlay()
#alternative: 2d-contour plot:
#x=r_[-10:10:100j]
#y=r_[-10:10:100j]
#z= add.outer(x*x, y*y)
#### Contour plot of z = x**2 + y**2
#p.contour(x,y,z)
#### ContourF plot of z = x**2 + y**2
#p.figure()
#p.contourf(x,y,z)
#p.show()
[docs] def show(self):
plt.show()
def _printPlotOverlay(self):
#plot_overlay = [(points), (lines), (broken lines), , (ellipses), (rectangles), (text), (legend)]
#(points),(broken lines), (lines) = [x-list,y-list]
#(ellipses) = list[ tuple(x,y), float(width), float(height), float(angle) ) ## str(color) ]
#(rectangles) = list[ tuple(x,y), float(width), float(height) ]
#(text) = list[ tuple(x,y), string(text)
#Llegend) = list[str(...),... ]
for m in self.merge_index:
#ax1 = self.fig[m]
if self.plot_overlay[m][0] != []:#draw points
for i in self.plot_overlay[m][0]:
self.ax[m].plot(i[0],i[1], marker='.')#, color='r', ls='')
if self.plot_overlay[m][1] != []:#draw broken lines
for i in self.plot_overlay[m][1]:
self.ax[m].plot(i[0],i[1], marker=',')#, color='r', ls='')
if self.plot_overlay[m][2] != []:#draw lines
for i in self.plot_overlay[m][2]:
self.ax[m].plot(i[0],i[1], marker='-')#, color='r', ls='')
if self.plot_overlay[m][5] != []:#draw text
t = ""
y = 0.95
for i in self.plot_overlay[m][5]:
t += i + "\n"
y -= 0.034
t = t[:-2]
#plt.text(2, y, t, fontsize=14)
text_layer = self.ax[m].annotate(t, xy=(0.025, y), xycoords='axes fraction',
color = 'black',backgroundcolor = 'white')
#set semitransparent background for text-layer
text_layer.set_bbox(dict(facecolor='white', alpha=0.5))
if self.plot_overlay[m][6] != []:#draw legend
for i in self.plot_overlay[m][6]:
self.ax[m].legend(tuple(self.plot_overlay[m][6]),
loc='upper center', bbox_to_anchor=(0.5, -0.05),
fancybox=True, shadow=True, ncol=5)#, color='r', ls='')
#plt.legend()
[docs] def save(self,file_name, folder_name = ""):
file_name = _utils.prepareFileSystem(file_name, folder_name)
self.fig.savefig(file_name,
facecolor=self.fig.get_facecolor(), edgecolor='none')
def _getAxisValues(self):
###transform sort_values to viewable axis-values
axis_values = []
for i in range(self.nDim):
steps = int(self._basis_dim[i].resolution/5)
axis_values.append([])
n = steps
for j in range(self._basis_dim[i].resolution):
if n == steps:
axis_values[i].append('{0:.1g}'.format(self.sortMatrix[i][j]))
n = 0
else:
axis_values[i].append("")
n += 1
return axis_values
def _getAxisRange(self):
axis_range = []
for i in range(self.nDim):
axis_range.append(self._basis_dim[i]._include_from_to[0])#min
axis_range.append(self._basis_dim[i]._include_from_to[1])#max
#extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
return axis_range