[英]How to plot 3D function as 2D colormap in python?
是否有任何python庫可以讓我繪制z = f(x,y),其中z表示為密集光柵化圖像中的顏色(與一堆散點圖的顏色相對)? 如果是這樣,我會使用什么功能?
看起來matplotlib.pyplot中的一些輪廓函數接近我想要的,但它們繪制輪廓線,我不希望這樣。
這是一個具體的簡單示例(也適用於不能為x
和y
采用矩陣參數的x
):
# 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()
在matplotlib
查看pcolor
或imshow
的文檔。
另一個好的開始是看看matplotlib畫廊,看看是否有一個符合你要求的情節類型,然后使用示例代碼作為你自己工作的起點:
給予應有的信用:這只是Andre Holzner答案的微小變化。 如果必須,請向他投票!
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.
為了擴展我上面的評論,這里有一些計算網格上的函數的可能方法
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
# t h i s i s t h e w a y t o g o
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 (i.e., 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$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.