2012-07-06 28 views
6

Tôi đang học Python và đây là câu hỏi đầu tiên của tôi ở đây. Tôi đã đọc các chủ đề khác liên quan đến việc sử dụng imshow nhưng không tìm thấy bất kỳ điều gì hữu ích. Xin lỗi vì tiếng Anh của tôi không tốt.imshow và histogram2d: không thể khiến chúng hoạt động

Tôi đã vẽ một tập hợp các điểm ở đây, trái đồ họa:

points (left) and image (right)

Bây giờ tôi muốn xem một hình ảnh của mật độ điểm, vì vậy tôi sử dụng imshowhistogram2d và tôi đã nhận hình ảnh ở bên phải trong liên kết trước.

Hình ảnh không tương ứng với phân phối điểm. Sao có thể như thế được? Tôi đã theo các hướng dẫn trong sự giúp đỡ và thậm chí thay đổi một số thông số nhưng không làm việc :(

Mã này là:

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() 

Các liên kết cho các dữ liệu sử dụng là ở đây:

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

Bất kỳ trợ giúp nào được đánh giá cao

+2

định 'origin =' lower'' cho hàm imshow – gcalmettes

+0

@gcalmettes: Đây không làm việc :( – skytux

+0

Bây giờ nó làm việc, nhưng thiết H.transpose() Cảm ơn !!. – skytux

Trả lời

5

Thử nội suy khác nhau và chuyển ma trận để lấy nó trong cùng một trục:

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

Điều này không hiệu quả nhưng nhờ @urinieto – skytux

+0

@skytux bạn nói đúng, các trục đã được hoán đổi. Tôi vừa cập nhật câu trả lời của tôi.Cảm ơn đã cho tôi biết –

+0

Điều này làm việc tốt với ma trận transposed và ... ([:: -1]) cái gì thế này ?? Nhưng tôi đã sử dụng mức độ như DiggyF đã nói trước đây bởi vì trong trường hợp của tôi nó đã bị đảo ngược. Cảm ơn rất nhiều !! – skytux

4

Đây có phải là điều bạn muốn nhận không? Bạn có thể sử dụng pcolor (và pcolormesh) nếu bạn muốn chuyển tọa độ x và y.

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

Đối imshow bạn phải đảo ngược chiều đầu tiên, bởi vì imshow sử dụng hàng không có trụ sở, chỉ số cột cho x, y. Vẽ từ trên xuống.

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

imshow example

+0

Cảm ơn câu trả lời của bạn! Trong trường hợp đầu tiên (pcolor) bạn sử dụng j_h (trục x) đầu tiên và sau đó h_k (trục y). Điều đó có đúng không? ... bởi vì cốt truyện của tôi là ngược lại. Ngoài ra thùng phải bằng nhau theo hướng x và y? Trong trường hợp thứ hai (imshow) hình ảnh mật độ không theo hướng của các điểm nếu bạn vẽ chúng lại với nhau ... – skytux

+0

Imshow giả định tọa độ x và y bằng nhau. Pcolor cũng hoạt động cho các tọa độ không đồng nhất và không thẳng. Tôi nghĩ tôi sẽ loại bỏ một số tính toán x, y như một ví dụ đơn giản hơn.Điều chính là imshow, theo mặc định, có nguồn gốc ở trên cùng. Tùy chọn origin = lower, mà gcalmettes được đề xuất, thanh lịch hơn. – SiggyF

+0

Thực sự sử dụng origin = lower work, nhưng chỉ với H.transpose() !! – skytux

Các vấn đề liên quan