2013-09-28 146 views
8

Tôi phải đại diện cho khoảng 30.000 điểm trong một ô phân tán trong matplotlib. Những điểm này thuộc về hai lớp khác nhau, vì vậy tôi muốn mô tả chúng với các màu khác nhau.Trực quan hóa các ô phân tán với các điểm chồng chéo trong matplotlib

Tôi đã thành công khi làm như vậy, nhưng có vấn đề. Các điểm trùng lặp ở nhiều vùng và lớp mà tôi mô tả cuối cùng sẽ được hiển thị trên đầu trang của các điểm khác, ẩn nó. Hơn nữa, với âm mưu phân tán là không thể hiển thị bao nhiêu điểm nằm trong mỗi khu vực. Tôi cũng đã cố gắng tạo một biểu đồ 2d với histogram2d và imshow, nhưng rất khó để hiển thị các điểm thuộc về cả hai lớp theo một cách rõ ràng.

Bạn có thể đề xuất một cách để làm rõ cả việc phân phối các lớp và tập trung của các điểm không?

EDIT: Để được rõ ràng hơn, đây là link vào tập tin dữ liệu của tôi trong định dạng "x, y, lớp"

+0

Tại sao biểu đồ không có hai màu? Nó trông không đủ tốt sao? –

+0

@OfirIsrael Tôi đã thử sử dụng histogram2d và imshow với các mức alpha để có hai biểu đồ chồng chéo, nhưng kết quả có vẻ rất kém – markusian

+0

Bạn đã thử hiển thị biểu đồ bằng cách sử dụng đường viền thay vì pha trộn alpha? http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.contour – grep

Trả lời

12

Một cách tiếp cận là để âm mưu dữ liệu như một âm mưu phân tán với một alpha thấp, vì vậy bạn có thể thấy các điểm riêng lẻ cũng như đo lường mật độ thô. (Nhược điểm này là cách tiếp cận này có một phạm vi giới hạn của chồng lên nhau nó có thể hiển thị - tức là, mật độ tối đa khoảng 1/alpha.)

Dưới đây là một ví dụ:

enter image description here

Như bạn có thể tưởng tượng, vì phạm vi chồng chéo giới hạn có thể được biểu thị, có sự cân bằng giữa khả năng hiển thị của các điểm riêng lẻ và biểu thức số lượng chồng chéo (và kích thước của điểm đánh dấu, cốt truyện, v.v.).

import numpy as np 
import matplotlib.pyplot as plt 

N = 10000 
mean = [0, 0] 
cov = [[2, 2], [0, 2]] 
x,y = np.random.multivariate_normal(mean, cov, N).T 

plt.scatter(x, y, s=70, alpha=0.03) 
plt.ylim((-5, 5)) 
plt.xlim((-5, 5)) 
plt.show() 

(tôi giả sử ở đây bạn có nghĩa là điểm 30e3, không 30e6. Đối với 30e6, tôi nghĩ rằng một số loại âm mưu mật độ trung bình sẽ là cần thiết.)

7

Bạn cũng có thể tô màu cho điểm bằng máy tính đầu tiên một ước tính mật độ hạt nhân của sự phân bố của phân tán, và sử dụng các giá trị mật độ để xác định một màu cho mỗi điểm của phân tán. Để sửa đổi mã trong ví dụ trước đó:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import gaussian_kde as kde 
from matplotlib.colors import Normalize 
from matplotlib import cm 

N = 10000 
mean = [0,0] 
cov = [[2,2],[0,2]] 

samples = np.random.multivariate_normal(mean,cov,N).T 
densObj = kde(samples) 

def makeColours(vals): 
    colours = np.zeros((len(vals),3)) 
    norm = Normalize(vmin=vals.min(), vmax=vals.max()) 

    #Can put any colormap you like here. 
    colours = [cm.ScalarMappable(norm=norm, cmap='jet').to_rgba(val) for val in vals] 

    return colours 

colours = makeColours(densObj.evaluate(samples)) 

plt.scatter(samples[0], samples[1], color=colours) 
plt.show() 

Scatter plot with density information

Tôi đã học được thủ thuật này một thời gian trước khi tôi nhận thấy các tài liệu của hàm phân tán -

c : color or sequence of color, optional, default : 'b' 

c thể là một chuỗi định dạng màu duy nhất hoặc chuỗi các thông số màu có độ dài N hoặc một chuỗi gồm N các số được ánh xạ tới col hoặc bằng cách sử dụng cmapnorm được chỉ định qua kwargs (xem bên dưới). Lưu ý rằng c không được là một chuỗi RGB hoặc RGBA đơn vì nó không thể phân biệt được với một mảng các giá trị được phân tách. c có thể là mảng 2-D trong đó các hàng là RGB hoặc RGBA, tuy nhiên, bao gồm cả trường hợp của một hàng để chỉ định cùng một màu cho tất cả các điểm.