Python:带有imshow的2D彩色地图

时间:2014-07-22 20:56:22

标签: python graphics graph matplotlib

我试图使用颜色在二维图上表示两个变量的函数。 我遇到了这个例子here

from numpy import exp,arange
from pylab import meshgrid,cm,imshow,contour,clabel,colorbar,axis,title,show
# the function that I'm going to plot
def z_func(x,y):
 return (1-(x**2+y**3))*exp(-(x**2+y**2)/2)

x = arange(-3.0,3.0,0.1)
y = arange(-3.0,3.0,0.1)
X,Y = meshgrid(x, y) # grid of point
Z = z_func(X, Y) # evaluation of the function on the grid

im = imshow(Z,cmap=cm.RdBu) # drawing the function
# adding the Contour lines with labels
cset = contour(Z,arange(-1,1.5,0.2),linewidths=2,cmap=cm.Set2)
clabel(cset,inline=True,fmt='%1.1f',fontsize=10)
colorbar(im) # adding the colobar on the right
# latex fashion title
title('$z=(1-x^2+y^3) e^{-(x^2+y^2)/2}$')
show()

产生enter image description here

但是,轴刻度和限制与实际的x和y数据(两者都在-3和3之间)不对应。如何使它们与实际数据相对应?

3 个答案:

答案 0 :(得分:3)

我不会使用imshow绘制一个2d函数,因为你的问题。显示是出于惊喜,显示图像。 Axes标签来自"像素"的数量。你的价值观。

为什么你要从numpy和pylab中输入一些东西? numpy包含在pylab中。

使用pcolor或更大的数组pcolormesh。

from pylab import pcolor
im = pcolor(X,Y, Z, cmap='RdBu' )

答案 1 :(得分:1)

颜色条轴的范围由Z的最小值和最大值确定。

>>> Z.min()
-0.96365584108555036

>>> Z.max()
1.4203545446927801

默认情况下,图中x和y轴的范围是数组Z中的索引。正如Warren指出的那样,您可以使用extent的{​​{1}}关键字参数更改轴的标记方式。

imshow

或更一般地

extent = (-3.0,3.0, 3.0,-3.0)

extent = (x[0],x[-1], y[-1],y[0] ) imshow( Z,cmap=cm.RdBu, extent=extent ) cset = contour(Z,arange(-1,1.5,0.2),linewidths=2,cmap=cm.Set2,extent=extent) 获取低x坐标,然后是高x,然后是低y,然后是高y。图像的默认约定是从左上角开始的y轴原点。这就是为什么extent中的最后两个条目与您可能期望的“相反”的原因。

答案 2 :(得分:1)

extent=(-3, 3, 3, -3)添加到imshow的调用中 致extent=(-3, 3, -3, 3)的电话contour(注意不可思议的标志变化!):

import numpy as np
import matplotlib.pyplot as plt


def z_func(x, y):
    return (1 - (x ** 2 + y ** 3)) * np.exp(-(x ** 2 + y ** 2) / 2)

x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-3.0, 3.0, 0.1)
X, Y = np.meshgrid(x, y)
Z = z_func(X, Y) 


im = plt.imshow(Z, cmap=plt.cm.RdBu, extent=(-3, 3, 3, -3))  
cset = plt.contour(Z, np.arange(-1, 1.5, 0.2), linewidths=2,
                   cmap=plt.cm.Set2,
                   extent=(-3, 3, -3, 3))
plt.clabel(cset, inline=True, fmt='%1.1f', fontsize=10)
plt.colorbar(im)  

plt.title('$z=(1-x^2+y^3) e^{-(x^2+y^2)/2}$')

plt.show()

enter image description here