Стандартный способ построения графика matplotlib - это данные, хранящиеся в массиве numpy.
В этом случае для примера вы можете определить сетку:
mesh1, mesh2, mesh3 = np.meshgrid(var1, var2, var3)
, который определит 3 трехмерных массива, которые могут быть использованы в качестве входных данных для графика поверхности matplotlib.
Тогда функция может быть вызвана без циклов, и операции будут выполняться поэлементно напрямую. т.е.
res1 = func1(mesh1, mesh2, mesh3)
И в конечном итоге сделать графики с кодом, похожим на этот псевдокод:
for i in var1:
plt.plot_surface(mesh2[i,:,:], mesh3[i,:,:], res1[i,:,:])
Однако в случае очень больших массивов создание 3d-сетки может быть слишком трудоемким. Поэтому, может быть, лучше построить 2-мерные сетки и перебрать третий. Одним из примеров этого будет:
mesh2, mesh3 = np.meshgrid(var2, var3) # it can be defined outside because only var1 varies during the loop
for i in var1:
res1 = func1(i,mesh2,mesh3)
plt.plot_surface(mesh2, mesh3, res1)