1

我想知道是否可以“缩放”要绘制到绘图范围内的图像输入。更清楚地说,这就是我需要的:

我有一个 400 * 400 的图像,它是基于间隔为 -1..1 的函数生成的。因此,我进行了翻译以保存这些数据,如下所示:

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)

这也不起作用。

任何帮助将非常感激。谢谢。

4

2 回答 2

0

您可以使用extentkwarg 简单地执行此操作:

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)

在此处输入图像描述

于 2013-09-13T18:49:01.423 回答
-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)在运行此函数后使用它来将轮廓叠加到正确轴化的地图上将是相当简单的,尽管您必须小心轴以确保它们以如下方式翻转你想要他们……

于 2013-09-13T18:29:57.463 回答