Как построить трехмерную функцию как 2D-карту в python?

Существуют ли библиотеки python, которые позволят мне построить z = f (x, y), где z представляется в виде цвета в плотно растрированном изображении (в отличие от цвета пучка точек рассеивания)? Если да, то какую функцию я использую?

Похоже, некоторые из функций контура в matplotlib.pyplot приближаются к тому, что я хочу, но они рисуют контурные линии, и я не хочу этого.

4 Solutions collect form web for “Как построить трехмерную функцию как 2D-карту в python?”

Взгляните на документацию для pcolor или imshow в matplotlib .

Еще одно хорошее место для начала – взгляните на галерею matplotlib и посмотрите, есть ли тип сюжета, который соответствует тому, что вы ищете, а затем используйте образец кода как точку перехода для своей собственной работы:

http://matplotlib.sourceforge.net/gallery.html

вот конкретный простой пример (работает также для функций, которые не могут принимать матричные аргументы для x и y ):

 # the function to be plotted def func(x,y): # gives vertical color bars if x is horizontal axis return x import pylab # define the grid over which the function should be plotted (xx and yy are matrices) xx, yy = pylab.meshgrid( pylab.linspace(-3,3, 101), pylab.linspace(-3,3, 111)) # indexing of xx and yy (with the default value for the # 'indexing' parameter of meshgrid(..) ) is as follows: # # first index (row index) is y coordinate index # second index (column index) is x coordinate index # # as required by pcolor(..) # fill a matrix with the function values zz = pylab.zeros(xx.shape) for i in range(xx.shape[0]): for j in range(xx.shape[1]): zz[i,j] = func(xx[i,j], yy[i,j]) # plot the calculated function values pylab.pcolor(xx,yy,zz) # and a color bar to show the correspondence between function value and color pylab.colorbar() pylab.show() 

Чтобы развернуть мой комментарий выше, вот несколько возможных способов вычисления функции на сетке

 boffi@debian:~/Documents/tmp$ cat grid.py import numpy as np def z(x,y): return np.sin(np.sqrt(x*x+y*y)) x = np.linspace(-1,1,11) y = np.linspace(-2,2,21) # naive Z0 = np.zeros((len(y), len(x))) for i, X in enumerate(x): for j, Y in enumerate(y): Z0[j,i] = z(X,Y) # trampoline on a double list comprehension, # it is possibly faster, sure it uses more memory Z1 = np.array([[z(X,Y) for X in x] for Y in y]) # numpy has meshgrid, # meshgrid uses twice memory as the result matrix but # if used _correctly_ it's FAST X, Y = np.meshgrid(x, y) # numpy can avoid you explicit looping, # but if you are so inclined... Z2 = np.zeros((len(y), len(x))) for r in range(len(y)): for c in range(len(x)): Z2[r, c] = z(X[r, c], Y[r, c]) # numpy has ufuncs, and # thisisthewaytogo Z3 = z(X, Y) # numpy has broadcasting (it's slower than Z = z(X, Y), less memory) Z4 = z(x, y[:,None]) # note that x is still a _row_ of numbers, indexed by _columns_, # while y[:,None] is now a _column_ of numbers, indexed by _rows_, # so that Z4[row,column] <-- z(x[column], y[row]) # a bit of testing # in previous answers, Z2 (ie, explicit loops) # is the preferred method --- here we show that the other four # possible methods give you exactly the same result print np.all(Z2==Z0) print np.all(Z2==Z1) print np.all(Z2==Z3) print np.all(Z2==Z4) boffi@debian:~/Documents/tmp$ python2 grid.py True True True True boffi@debian:~/Documents/tmp$ 

Чтобы дать кредит там, где это необходимо: это лишь незначительная вариация ответа Андре Хольцнера. Пожалуйста, поддержите его, если нужно!

 import pylab def f(x, y): return pylab.cos(x) + pylab.sin(y) xx = pylab.linspace(-5, 5, 100) yy = pylab.linspace(-5, 5, 100) zz = pylab.zeros([len(xx), len(yy)]) for i in xrange(len(xx)): for j in xrange(len(yy)): zz[j, i] = f(xx[i], yy[j]) pylab.pcolor(xx, yy, zz) pylab.show() 

Синтаксис, пожалуй, проще читать со строгим минимумом размеров и индексов массива. Он опирается на следующий пункт (цитируемый из документа).

If either or both of X and Y are 1-D arrays or column vectors, they will be expanded as needed into the appropriate 2-D arrays, making a rectangular grid.

  • Matplotlib scatterplot; цвет как функция третьей переменной
  • Matplotlib imshow offset для совпадения оси?
  • частотная тропа в matplotlib
  • Пример кода matplotlib throws TclError
  • Перемещение радиальных меток на полярном участке в matplotlib
  • Как я могу использовать морское дно, не меняя значения matplotlib по умолчанию?
  • Сложенная диаграмма: неправильная высота баров и меток
  • Общая xlabel / ylabel для подзаголовков matplotlib
  • Python - лучший язык программирования в мире.