2015-01-23 14 views
9

Đoạn mã sau cung cấp cho tôi một violinplot rất đẹp (và hộp bên trong).Làm thế nào để phù hợp hơn với các nốt violin biển?

import numpy as np 
import seaborn as sns 
import matplotlib.pyplot as plt 

foo = np.random.rand(100) 
sns.violinplot(foo) 
plt.boxplot(foo) 
plt.show() 

output

Cho đến nay rất tốt. Tuy nhiên, khi tôi nhìn vào foo, biến không chứa bất kỳ giá trị âm nào. Lô đất seaborn có vẻ gây hiểu nhầm ở đây. Hộp matplotlib bình thường cho một cái gì đó gần gũi hơn với những gì tôi mong đợi.

Làm cách nào để tôi có thể làm cho các ô violin phù hợp hơn (không hiển thị giá trị âm sai)?

+0

Vâng, điều đó có thể không dễ dàng. Đây là một vật phẩm của KDE, mà không biết rằng có một ranh giới cứng tại 0. Nếu bạn quan tâm đến vấn đề này, xem thêm: http://stats.stackexchange.com/questions/65866/good-methods-for -density-of-phi-negative-variables-in-r? lq = 1 – cel

+0

@cel Cảm ơn bạn. đó là điều tôi đang nghĩ. Nhưng nó không thể được trang bị chặt chẽ hơn? – n1000

+1

Có các thuật toán cho điều đó. Xem kết quả ấn tượng trong câu trả lời này: http://stats.stackexchange.com/a/71291. Tuy nhiên tôi chưa thấy nó trong python. – cel

Trả lời

10

Là lưu ý nhận xét, đây là một hệ quả (tôi không chắc chắn tôi muốn gọi nó là "tạo tác") của các giả định cơ bản là KDE gaussian. Như đã được đề cập, điều này là không thể tránh khỏi và nếu dữ liệu của bạn không đáp ứng các giả định đó, bạn có thể nên sử dụng một hộp thoại chỉ hiển thị các điểm tồn tại trong dữ liệu thực tế.

Tuy nhiên, trong câu trả lời của bạn, bạn hỏi xem liệu nó có phù hợp với "chặt chẽ hơn" không, điều này có thể có nghĩa là một vài điều.

Một câu trả lời có thể là thay đổi băng thông của hạt nhân làm mịn. Bạn làm điều đó với đối số bw, đó thực sự là một yếu tố tỷ lệ; băng thông sẽ được sử dụng là bw * data.std():

data = np.random.rand(100) 
sns.violinplot(y=data, bw=.1) 

enter image description here

câu trả lời khác có thể là để cắt violin ở những thái cực của datapoints. KDE sẽ vẫn là phù hợp với với mật độ mở rộng vượt quá giới hạn dữ liệu của bạn, nhưng đuôi sẽ không được hiển thị. Bạn làm điều đó với tham số cut, trong đó xác định có bao nhiêu đơn vị băng thông qua các giá trị cực đoan mật độ sẽ được rút ra. Để cắt xén, đặt nó là 0:

sns.violinplot(y=data, cut=0) 

enter image description here

Bằng cách này, các API cho violinplotgoing to change trong 0,6, và tôi đang sử dụng phiên bản phát triển ở đây, nhưng cả bwcut luận tồn tại trong phiên bản phát hành hiện tại và hành xử nhiều hơn hoặc ít hơn theo cùng một cách.

+1

Tôi không thích giải pháp bằng cách sử dụng 'cắt'. Nó ẩn thực tế là 'KDE' không thể phù hợp với mật độ như vậy một cách chính xác. Mật độ gần ranh giới 0 là gây hiểu lầm, vì bạn sẽ nhận được một ước lượng mật độ như vậy, ngay cả khi biểu đồ tương ứng có tối đa là 0, – cel

+0

Xem yêu cầu tính năng tại https://github.com/mwaskom/seaborn/issues/ 525 (chờ đợi các thay đổi ngược dòng trong các mô hình thống kê). – naught101

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