我想知道我是否可以“缩放”图像输入以绘制到图中的范围。 更清楚的是,这就是我需要的:
我有一个基于间隔为-1..1的函数生成的400 * 400图像。所以,我做翻译来保存这些数据,如下所示:
x = Utils.translate(pos_x, 0, self.width, -1, 1)
y = Utils.translate(pos_y, 0, self.height, -1, 1)
data = Utils.map_position_to_function(x, y)
即,首先我将其位置映射到我的范围,然后根据这个“新位置”计算de f(x,y)并保存数据。
问题是,稍后,我必须在功能范围内表示图像轮廓。 所以,我有一个400 * 400的图像,我必须在一个范围为-1..1的图中表示。
这非常有效:
import pylab as plt
im = plt.array(Image.open('Mean.png').convert('L'))
plt.figure()
plt.contour(im, origin='image')
plt.axis('equal')
但我找不到让x / y轴在-1..1
范围内的方法我试过了:
row = np.linspace(-1,1,0.25)
X,Y = np.meshgrid(row,row)
Z = plt.array(Image.open('Mean.png').convert('L'))
plt.contour(X,Y,Z)
但它不起作用,它使感觉不起作用,但我不知道我怎么能做我想要的。我有关于此图像中的数据的信息,所以我也尝试做这两种方法:
# 1
plt.figure()
row = np.linspace(-1,1,0.25)
X,Y = np.meshgrid(row,row)
Z = ImageMedia[Utils.translate(X, 400, 400, -1, 1), Utils.translate(Y, 400, 400, -1, 1)]
plt.contour(X,Y,Z)
# 2
im = plt.array(Image.open('Mean.png').convert('L'))
plt.figure()
plt.contour(im, origin='image')
v = [-1, 1, -1, 1]
plt.axis(v)
哪个也不起作用。
非常感谢任何帮助。 感谢。
答案 0 :(得分:0)
你可以使用extent
kwarg:
im = ax.imshow(data, ..., extent=[-1, 1, -1, 1])
(doc)它也适用于contour
,contourf
等。
例如:
fig, ax2 = plt.subplots(1, 1)
im = rand(400, 400)
ax2.imshow(im, interpolation='none', extent=[-1, 1, -1, 1])
另一种处理此问题的方法是,如果您确实不想使用extent
并让您的生活更轻松,那么请在格式化程序中插入缩放因子:
from matplotlib.ticker import FuncFormatter
fig, ax2 = plt.subplots(1, 1)
im = rand(400, 400)
ax2.imshow(im, interpolation='none', origin='bottom')
nbins = 5
scale_factor = .5
form_fun = lambda x, i, scale_factor=scale_factor: '{:.3f}'.format(scale_factor * x)
ax2.get_xaxis().set_major_formatter(FuncFormatter(form_fun))
ax2.get_yaxis().set_major_formatter(FuncFormatter(form_fun))
ax2.get_xaxis().get_major_locator().set_params(nbins=nbins)
ax2.get_yaxis().get_major_locator().set_params(nbins=nbins)
答案 1 :(得分:-1)
我实际上编写了一个代码来自己做类似的事情,因为它对许多科学应用程序都有影响。我碰巧在检查stackoverflow时调整了那些代码,所以这是你的幸运日....下面是一个函数,用于在轴上绘制带有适当刻度标记的图像。
def plotmap(mapx, mapy, mymap,flipx=False, nt=4):
'''plots a map (mymap) with specified axes (mapx, mapy) and number of ticks (nt)'''
nx=len(mapx)
ny=len(mapy)
mymap=mymap[:,::-1] #flip y axis (make start from lower left, rather than upper)
if(flipx): #flip x-axis (useful in some applications (e.g. west longitude))
mymap=mymap[::-1,:]
pl.imshow(mymap.transpose()) #plot an image map.. but contour could work too
pl.colorbar()
if(flipx):
mapx=mapx[::-1]
myxticks=pl.arange(mapx[0],mapx[-1], (mapx[-1]-mapx[0])/nt) #picks appropriate tick marks
myyticks=pl.arange(mapy[-1],mapy[0], -(mapy[-1]-mapy[0])/nt)
for i in range(nt):
myxticks[i]=round(myxticks[i],3) #makes the ticks pretty by lopping off insignificant figures
myyticks[i]=round(myyticks[i],3)
pl.xticks(range(0, nx, nx/nt), myxticks) #plots ticks at corresponding coordinates
pl.yticks(range(0, ny, ny/nt), myyticks)
这将绘制一个图像,然后在运行此函数将轮廓重叠到正确的轴线化地图上之后使用contour(im)
将是相当简单的,尽管您必须小心轴以确保他们按照你想要的方式翻转......