In [1]:
import os
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
In [2]:
matplotlib.rcParams['contour.negative_linestyle'] = 'solid'
In [3]:
PLOHE = [
  {'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: x**2 + y**2, 'shading': True},
  {'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: -x**2 - y**2 + 61, 'shading': True},
  {'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: x**2 - y**2, 'shading': True},
  {'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: y**2 - x**2, 'shading': True},
  {'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: x + y, 'shading': True, 'zticks': [-5,0,5]},
  {'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: -x + y, 'shading': False},
  {'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: x**2, 'shading': False},
  {'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: -x**2 + 30, 'shading': False},
  {'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: y**2, 'shading': True},
  {'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: -y**2 + 30, 'shading': True},
  {'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: -x, 'shading': False},
  {'xkor':[-5, 5.9, 2], 'ykor':[-5, 5.9, 2], 'fun': lambda x,y: x, 'shading': False, 'elev': 20, 'azim': -40},
  {'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: y, 'shading': False},
  {'xkor':[-5, 5.9, 2], 'ykor':[-5, 5.9, 2], 'fun': lambda x,y: -y, 'shading': False, 'elev': 20, 'azim': -55},
  {'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: y - np.sin(x), 'shading': True, 
   'zticks': [-5,0,5]},
  {'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: x - np.sin(y), 'shading': True, 
   'zticks': [-5,0,5]},
  {'xkor':[-5, 5.1, 0.5], 'ykor':[-5, 5.1, 0.5], 'fun': lambda x,y: 10 * 2**(-0.15 * (x**2 + y**2)), 
   'shading': True},
  {'xkor':[-5, 5.1, 0.5], 'ykor':[-5, 5.1, 0.5], 'fun': lambda x,y: -10 * 2**(-0.15 * (x**2 + y**2)) + 11, 
   'shading': True},
  {'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'fun': lambda x,y: 10 - np.abs(x) - np.abs(y), 'shading': True},
  {'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'fun': lambda x,y: np.abs(x) + np.abs(y), 'shading': True},
  {'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'fun': lambda x,y: np.abs(x) - np.abs(y) + 5, 'shading': True},
  {'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'fun': lambda x,y: -np.abs(x) + np.abs(y) + 5, 'shading': True}
]
In [4]:
NIVO = [
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x**2 + y**2, 'levels': [2,8,18,30]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -x**2 - y**2 + 61, 'levels': [35,45,55,60]},
  {'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: x**2 - y**2, 'levels': [-20,-10,-3,3,10,20], 
      'manual_loc': [(0, -5),(0,5),(0,3),(0,-3),(0,-1),(0,1),(-5,0),(5,0),(-3,0),(3,0),(-1,0),(1,0)]},
  {'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: y**2 - x**2, 'levels': [-20,-10,-3,3,10,20],
      'manual_loc': [(0, -5),(0,5),(0,3),(0,-3),(0,-1),(0,1),(-5,0),(5,0),(-3,0),(3,0),(-1,0),(1,0)]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x + y, 'levels': [-8,-6,-3,0,3,6,8]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -x + y, 'levels': [-8,-6,-3,0,3,6,8]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x**2, 'levels': [1,6,15]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -x**2 + 30, 'levels': [15,24,29]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: y**2, 'levels': [1,6,15]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -y**2 + 30, 'levels': [15,24,29]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -x, 'levels': [-4,-2,0,2,4]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x, 'levels': [-4,-2,0,2,4]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: y, 'levels': [-4,-2,0,2,4]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -y, 'levels': [-4,-2,0,2,4]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: y - np.sin(x), 'levels': [-4,-2,0,2,4]},
  {'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x - np.sin(y), 'levels': [-4,-2,0,2,4]},
  {'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: 10 * 2**(-0.15 * (x**2 + y**2)), 
   'levels': [1,3,6,9], 
     'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
  {'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: -10 * 2**(-0.15 * (x**2 + y**2)) + 11, 
   'levels': [3,6,9,10],
     'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
  {'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: 10 - np.abs(x) - np.abs(y), 'levels': [2,4,6,8],
     'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
  {'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: np.abs(x) + np.abs(y), 'levels': [2,4,6,8],
     'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
  {'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: np.abs(x) - np.abs(y) + 5, 'levels': [2,4,6,8],
     'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
  {'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: -np.abs(x) + np.abs(y) + 5, 'levels': [2,4,6,8]}
]
In [5]:
GRADIJENT = [
  {'xkor':[-5, 5, 1], 'ykor':[-5, 5, 1], 'dx': lambda x,y: 2*x, 'dy': lambda x,y: 2*y},
  {'xkor':[-5, 6, 1], 'ykor':[-5, 6, 1], 'dx': lambda x,y: -2*x, 'dy': lambda x,y: -2*y},
  {'xkor':[-5, 6, 1], 'ykor':[-5, 6, 1], 'dx': lambda x,y: 2*x, 'dy': lambda x,y: -2*y},
  {'xkor':[-5, 6, 1], 'ykor':[-5, 6, 1], 'dx': lambda x,y: -2*x, 'dy': lambda x,y: 2*y},
  {'xkor':[-5, 5, 1], 'ykor':[-5, 5, 1], 'dx': lambda x,y: 1, 'dy': lambda x,y: 1},
  {'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'dx': lambda x,y: -1, 'dy': lambda x,y: 1},
  {'xkor':[-5, 5, 1], 'ykor':[-4, 5, 1], 'dx': lambda x,y: 2*x, 'dy': lambda x,y: 0},
  {'xkor':[-5, 5.3, 1.2], 'ykor':[-4.2, 5, 1.2], 'dx': lambda x,y: -2*x, 'dy': lambda x,y: 0},
  {'xkor':[-5, 5, 1], 'ykor':[-3.7, 4, 1.2], 'dx': lambda x,y: 0, 'dy': lambda x,y: 2*y},
  {'xkor':[-5, 5, 1], 'ykor':[-4.7, 5, 1.3], 'dx': lambda x,y: 0, 'dy': lambda x,y: -2*y},
  {'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'dx': lambda x,y: -1, 'dy': lambda x,y: 0},
  {'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'dx': lambda x,y: 1, 'dy': lambda x,y: 0},
  {'xkor':[-5, 5, 1], 'ykor':[-4.8, 5, 1], 'dx': lambda x,y: 0, 'dy': lambda x,y: 1},
  {'xkor':[-5, 5, 1], 'ykor':[-4, 5, 1], 'dx': lambda x,y: 0, 'dy': lambda x,y: -1},
  {'xkor':[-5, 5, 1], 'ykor':[-5, 5, 1], 'dx': lambda x,y: -np.cos(x), 'dy': lambda x,y: 1},
  {'xkor':[-5, 5, 1], 'ykor':[-5, 5, 1], 'dx': lambda x,y: 1, 'dy': lambda x,y: -np.cos(y)},
  {'xkor':[-5, 5, 0.8], 'ykor':[-5, 5, 0.8], 'dx': lambda x,y: -3*2**(-3/20*x**2-3/20*y**2)*x*np.log(2), 
     'dy': lambda x,y: -3*2**(-3/20*x**2-3/20*y**2)*y*np.log(2)},
  {'xkor':[-5, 5, 0.8], 'ykor':[-5, 5, 0.8], 'dx': lambda x,y: 3*2**(-3/20*x**2-3/20*y**2)*x*np.log(2), 
     'dy': lambda x,y: 3*2**(-3/20*x**2-3/20*y**2)*y*np.log(2)},
  {'xkor':[-5, 5, 0.9], 'ykor':[-5, 5, 0.9], 'dx': lambda x,y: -x/np.abs(x) , 'dy': lambda x,y: -y/np.abs(y)},
  {'xkor':[-5, 5, 0.9], 'ykor':[-5, 5, 0.9], 'dx': lambda x,y: x/np.abs(x) , 'dy': lambda x,y: y/np.abs(y)},
  {'xkor':[-5, 5, 0.9], 'ykor':[-5, 5, 0.9], 'dx': lambda x,y: x/np.abs(x) , 'dy': lambda x,y: -y/np.abs(y)},
  {'xkor':[-5, 5, 0.9], 'ykor':[-5, 5, 0.9], 'dx': lambda x,y: -x/np.abs(x) , 'dy': lambda x,y: y/np.abs(y)}
]
In [6]:
fig = plt.figure(figsize=(18,120))
for i in range(len(PLOHE)):
    for j in range(3):
        if j == 0:
            ax=fig.add_subplot(len(PLOHE),3,3*i+1, projection='3d')
            p = PLOHE[i]
            xkor = np.arange(*p['xkor'])
            ykor = np.arange(*p['ykor'])
            X, Y = np.meshgrid(xkor,ykor)
            Z = p['fun'](X,Y)
            ax.plot_surface(X, Y, Z, color='pink', linewidth=0.6,edgecolors='k', shade=p['shading'])
            ax.set_xticks([-4,0,4])
            ax.set_yticks([-4,0,4])
            if 'zticks' in p:
                ax.set_zticks(p['zticks'])
            ax.set_xlabel('x',fontsize=12)
            ax.set_ylabel('y',fontsize=12)
            ax.set_zlabel('z',fontsize=12, labelpad=0)
            if ('elev' in p) and ('azim' in p):
                ax.view_init(elev=p['elev'], azim=p['azim'])
        else:
            ax=fig.add_subplot(len(PLOHE),3,3*i+1+j)
            if j == 1:
                p = NIVO[i]
                xkor = np.arange(*p['xkor'])
                ykor = np.arange(*p['ykor'])
                X, Y = np.meshgrid(xkor,ykor)
                Z = p['fun'](X,Y)
                contour = plt.contour(X, Y, Z, p['levels'], colors = 'k')
                if 'manual_loc' in p:
                    ax.clabel(contour, colors = 'k', fmt = '%2.0f', fontsize=9, manual=p['manual_loc'])
                else:
                    ax.clabel(contour, colors = 'k', fmt = '%2.0f', fontsize=9)
                if ('xlim' in p) and ('ylim' in p):
                    ax.set(xlim=p['xlim'], ylim=p['ylim'], aspect=1)
                else:
                    ax.set(xlim=[-5, 5], ylim=[-5, 5], aspect=1)
                ax.set_xlabel('x',fontsize=12)
                ax.set_ylabel('y',fontsize=12, rotation=0)
            elif j == 2:
                p = GRADIJENT[i]
                xkor = np.arange(*p['xkor'])
                ykor = np.arange(*p['ykor'])
                X, Y = np.meshgrid(xkor,ykor)
                dx = p['dx'](X,Y)
                dy = p['dy'](X,Y)
                plt.quiver(X,Y,dx,dy)
                ax.set(xlim=[-5, 5], ylim=[-5, 5], aspect=1)
                ax.set_xlabel('x',fontsize=12)
                ax.set_ylabel('y',fontsize=12, rotation=0)
In [ ]: