2013-06-27 38 views
7

Khi tạo một ô hexbin trong matplotlib, tôi thấy rằng các hàng gạch hình lục giác xen kẽ có kích thước khác nhau, đôi khi đáng kể như vậy. đang trình diễn này cho thấy tác dụng:Kích thước gạch không đều trong matplotlib hexbin

from matplotlib import pyplot as plt 
from matplotlib import cm as cm 
from matplotlib import mlab as ml 
import numpy as np 

n = 1e5 
x = y = np.linspace(-5, 5, 100) 
X, Y = np.meshgrid(x, y) 
Z1 = ml.bivariate_normal(X, Y, 2, 2, 0, 0) 
Z2 = ml.bivariate_normal(X, Y, 4, 1, 1, 1) 
ZD = Z2 - Z1 
x = X.ravel() 
y = Y.ravel() 
z = ZD.ravel() 
plt.subplot(111) 

plt.hexbin(x, y, C=z, gridsize=30, cmap=cm.jet, bins=None) 
plt.axis([x.min(), x.max(), y.min(), y.max()]) 

cb = plt.colorbar() 
cb.set_label('mean value') 
plt.show() 

Trong this image, với một gridsize 30, bạn có thể thấy rằng hàng thay thế được squished một chút theo chiều dọc:

Hiệu quả không phải là rất quan trọng, nhưng trong this magnified view của cùng một âm mưu hexbin nhưng với một lưới là 80, các hàng nhỏ gần bằng một nửa kích thước của các hàng lớn. (Các dữ liệu mẫu được tạo ra bắt đầu mis-phù hợp với lưới điện, quá, nhưng đó là một artifact không quan trọng.)

Các tài liệu hexbin đọc:

gridsize: [100 | số nguyên]

Số hình lục giác theo hướng x, mặc định bằng 100. Số lượng hình lục giác tương ứng theo hướng y được chọn sao cho hình lục giác gần như bình thường. Ngoài ra, lưới có thể là một tuple với hai yếu tố xác định số lượng hình lục giác theo hướng x và hướng y.

Nó chỉ đảm bảo rằng hình lục giác là "xấp xỉ" thường xuyên, nhưng có vẻ như, đặc biệt là trong các trường hợp như hình ảnh 80-lưới ở trên, hình lục giác có thể được thực hiện gần hơn thường xuyên bằng cách giảm số hàng những hàng nhỏ có thể được mở rộng và thường xuyên hơn. Hoặc, các hàng có kích thước bình thường có thể được thu nhỏ theo chiều dọc trong khi các hàng nhỏ được mở rộng theo chiều dọc, giữ cho tất cả các hàng có cùng chiều cao, ngay cả khi các ô không được định hình thường xuyên.

Nguyên nhân của sự bất thường này là gì và có thể tránh được không?

Trả lời

6

Sau một số thử nghiệm khác, tôi nghĩ rằng tôi đã tìm ra nguyên nhân. Tài liệu dành cho hexbin cũng đề cập đến:

độ rộng dòng: [Không | vô hướng]

Nếu Không, mặc định là dòng rc.theo chiều rộng. Lưu ý rằng đây là một bộ dữ liệu và nếu bạn đặt đối số đường truyền, bạn phải đặt nó làm một chuỗi các phao, theo yêu cầu của RegularPolyCollection.

lập luận khác từ khóa kiểm soát các thuộc tính Bộ sưu tập:

edgecolors: [Không | 'không' | mpl màu | trình tự màu]

Nếu 'không', vẽ các cạnh có cùng màu với màu tô. Đây là mặc định , vì nó tránh các pixel không bị ô nhiễm không rõ ràng giữa các hình lục giác.

Nếu Không, hãy vẽ đường viền trong màu mặc định.

Nếu một màu matplotlib arg hoặc chuỗi các bộ rgba, hãy vẽ các đường viền trong màu được chỉ định.

Bằng cách đặt độ rộng dòng thành (0,), tôi đã phơi bày các pixel không sơn không được sơn, nhưng hình lục giác của tôi có cùng kích thước.Có vẻ như một số hàng hình lục giác nằm trong một lớp cao hơn và được vẽ với các đường viền quá lớn nhô ra trên các hàng lân cận. Giá trị độ rộng của (1,) cho kết quả không đồng đều mà tôi đã thấy trước đây, vì vậy nó có thể là mặc định. Độ rộng dòng giữa 0 và 1 (tôi đang sử dụng 0,25) bao gồm các pixel không sơn mà không gây ra nhiều trùng lặp, tạo ra một âm mưu đẹp hơn nhiều. Tuy nhiên, điều này chỉ xảy ra khi lưu hình ảnh qua savefig() ở DPI cao hơn mặc định (tôi đang sử dụng dpi = 300). Chương trình gọi() hoặc lưu với DPI mặc định sẽ tạo ra các ô có các điểm ảnh không sơn được phát hiện. Vì vậy, trong khi hiệu quả, cách giải quyết này có phần hạn chế.