2012-07-06 34 views
6

我在学习Python,这是我的第一个问题。我已阅读其他与imshow的使用相关的主题,但没有找到任何有用的内容。对不起,我的英语不好。imshow和histogram2d:无法让他们工作

我策划了一组点的位置,左边图形:

points (left) and image (right)

现在我想看看点的密度的图像,所以我用imshowhistogram2d ,并在前面的链接中将图片显示在右侧。

该图像不对应点的分布。这怎么可能?我紧跟在帮助中的说明,甚至改变了一些参数,但没有奏效:(

的代码是:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 

j, h, k = np.loadtxt("test.dat", usecols=(2, 4, 6), \ 
    unpack=True) 

# límites 
xmin = -0.5 
xmax = 3.0 
ymin = -0.5 
ymax = 4.0 

# colores 
j_h = j - h 
h_k = h - k 

# no todas las estrellas son graficadas  
x1 = 0.5 
y1 = 0.5 
b = 2.2 
c = y1 - b * x1 

x = y = np.array([]) 

for xi, yi in zip(h_k, j_h): 
    if xi < (yi - c)/b: 
     x = np.append(x, xi) 
     y = np.append(y, yi) 

# gráfico 
fig = plt.figure(figsize=(8, 7)) 

ax = fig.add_subplot(111) 
#ax.plot(x, y, "go") 
ax.set_xlabel(r"X", fontsize=14) 
ax.set_ylabel(r"Y", fontsize=14) 
ax.axis([xmin, xmax, ymin, ymax]) 

# imagen 
rango = [[xmin, xmax], [ymin, ymax]] 
binsx = int((xmax - xmin)/0.05) 
binsy = int((ymax - ymin)/0.05) 
binsxy = [binsx, binsy] 

H, xedges, yedges = np.histogram2d(x, y, range=rango, bins=binsxy) 

extent = [yedges[0], yedges[-1], xedges[0], xedges[-1]] 
cp = ax.imshow(H, interpolation='bilinear', extent=extent, cmap=cm.jet) 
fig.colorbar(cp) 

plt.show() 

所使用的数据的链接是在这里:

https://dl.dropbox.com/u/10411539/python/test.dat

任何帮助表示赞赏

+2

指定'起源='lower''为imshow功能 – gcalmettes 2012-07-06 18:39:01

+0

@gcalmettes:这并没有工作:( – skytux 2012-07-06 19:21:30

+0

现在它的工作,但设置H.transpose()谢谢!。 – skytux 2012-07-06 19:36:05

回答

5

尝试不同的插值,并且转置矩阵得到它在同一轴线上:

cp = ax.imshow(H.transpose()[::-1], interpolation='nearest', extent=extent, cmap=cm.jet) 
+0

这不起作用,但谢谢@urinieto – skytux 2012-07-06 18:53:36

+0

@skytux你是对的,坐标轴已经交换了,我只是更新了我的答案,谢谢你让我知道。 – 2012-07-06 19:07:13

+0

这与矩阵转置和...([ -1])这是什么?但是我使用了范围,因为在我的情况下,它是倒过来的。非常感谢!! – skytux 2012-07-06 19:20:27

4

这是你想要的吗?如果你想传递x和y坐标,你可以使用pcolor(和pcolormesh)。

import urllib 
import numpy as np 
import matplotlib.pyplot as plt 
f = urllib.urlopen('https://dl.dropbox.com/u/10411539/python/test.dat') 
j, h, k = np.loadtxt(f, usecols=(2, 4, 6), \ 
    unpack=True) 
j, h, k 
j_h = j - h 
h_k = h - k 
H, xedges, yedges = np.histogram2d(j_h, h_k, bins=100) 
plt.pcolor(xedges, yedges, H) 

Example of pcolor using histogram2d

对于imshow你必须扭转第一个维度,因为imshow使用从零开始的行,列索引的X,Y。从上往下画。

plt.imshow(H[::-1,:], extent=(0,5, 0,2.5)) # typed in extent by hand. 

imshow example

+0

感谢您的回答!在第一种情况下(pcolor),首先使用j_h(x轴),然后使用h_k(y轴)。那是对的吗?......因为我的情节恰恰相反。箱也必须在x和y方向上相等?在第二种情况下(imshow),如果将密度图像绘制在一起,密度图像不会遵循点的方向... – skytux 2012-07-06 19:10:19

+0

Imshow假定等距的x和y坐标。 Pcolor也适用于非等距和非直线坐标。我想我会忽略一些x,y的计算作为一个更简单的例子。最主要的是,默认情况下,imshow的顶部是原点。 gcalmettes建议的origin = lower选项更加优雅。 – SiggyF 2012-07-06 19:22:32

+0

确实使用原点=较低的工作,但只与H.transpose()! – skytux 2012-07-06 19:35:40