2012-07-17 32 views
11

Tôi sử dụng biểu đồ thanh để biểu thị dữ liệu của từng nhóm. Một số thanh này khác nhau đáng kể với nhau. Làm thế nào tôi có thể chỉ ra sự khác biệt đáng kể trong cốt truyện thanh?Cho biết sự khác biệt có ý nghĩa thống kê trong biểu đồ thanh

import numpy as np 
import matplotlib.pyplot as plt 
menMeans = (5, 15, 30, 40) 
menStd  = (2, 3, 4, 5) 
ind = np.arange(4) # the x locations for the groups 
width=0.35 
p1 = plt.bar(ind, menMeans, width=width, color='r', yerr=menStd) 
plt.xticks(ind+width/2., ('A', 'B', 'C', 'D')) 

Tôi nhắm

enter image description here

+0

Are so sánh chỉ được thực hiện liền kề tại địa phương? Tức là, bạn chỉ muốn hiển thị sự khác biệt giữa '(A, B) (B, C) (C, D)' nhưng không phải là '(A, C)'? – Hooked

+0

Không, tôi muốn so sánh giữa tất cả các cặp có thể. – imsc

+1

Có thể khó hiển thị điều này trên biểu đồ, đặc biệt nếu có nhiều mục. Nếu bạn có N = 10, các mục có 45 so sánh cặp đôi khác nhau! Có vẻ như bạn có thể hiển thị giá trị p theo cặp của bạn trên ma trận thay thế. Điều này có hiệu quả không? – Hooked

Trả lời

14

tôi đã thực hiện một vài điều ở đây mà tôi đề nghị khi làm việc với âm mưu phức tạp. Kéo định dạng tùy chỉnh thành từ điển, nó làm cho cuộc sống trở nên đơn giản khi bạn muốn thay đổi tham số - và bạn có thể chuyển từ điển này sang nhiều ô. Tôi cũng đã viết một hàm tùy chỉnh cho annotate các giá trị lặp lại, như một phần thưởng mà nó có thể chú thích giữa (A,C) nếu bạn thực sự muốn (tôi đứng theo nhận xét của tôi rằng đây không phải là cách tiếp cận trực quan phù hợp). Nó có thể cần một số tinh chỉnh một khi dữ liệu thay đổi nhưng điều này sẽ đưa bạn đi đúng hướng.

import numpy as np 
import matplotlib.pyplot as plt 
menMeans = (5, 15, 30, 40) 
menStd  = (2, 3, 4, 5) 
ind = np.arange(4) # the x locations for the groups 
width= 0.7 
labels = ('A', 'B', 'C', 'D') 

# Pull the formatting out here 
bar_kwargs = {'width':width,'color':'y','linewidth':2,'zorder':5} 
err_kwargs = {'zorder':0,'fmt':None,'linewidth':2,'ecolor':'k'} #for matplotlib >= v1.4 use 'fmt':'none' instead 

fig, ax = plt.subplots() 
ax.p1 = plt.bar(ind, menMeans, **bar_kwargs) 
ax.errs = plt.errorbar(ind, menMeans, yerr=menStd, **err_kwargs) 


# Custom function to draw the diff bars 

def label_diff(i,j,text,X,Y): 
    x = (X[i]+X[j])/2 
    y = 1.1*max(Y[i], Y[j]) 
    dx = abs(X[i]-X[j]) 

    props = {'connectionstyle':'bar','arrowstyle':'-',\ 
       'shrinkA':20,'shrinkB':20,'linewidth':2} 
    ax.annotate(text, xy=(X[i],y+7), zorder=10) 
    ax.annotate('', xy=(X[i],y), xytext=(X[j],y), arrowprops=props) 

# Call the function 
label_diff(0,1,'p=0.0370',ind,menMeans) 
label_diff(1,2,'p<0.0001',ind,menMeans) 
label_diff(2,3,'p=0.0025',ind,menMeans) 


plt.ylim(ymax=60) 
plt.xticks(ind, labels, color='k') 
plt.show() 

enter image description here

+1

Cảm ơn rất nhiều. Rất thông tin. Tôi chỉ thay đổi 'ax.annotate (văn bản, xy = (X [i], y + 7), zorder = 10)' thành 'ax.annotate (văn bản, xy = (x, y + 7), zorder = 10) 'để làm cho các giá trị p được căn giữa. – imsc

+0

@imsc Đó là những gì tôi đã sử dụng lúc đầu, nhưng đó là vị trí của phía bên trái của khối văn bản - không phải là trung tâm của khối văn bản. Đối với tôi, có vẻ như nó hơi lệch tâm với vị trí đó. Dù bằng cách nào, tôi hy vọng bạn thấy làm thế nào bạn có thể tinh chỉnh đi! – Hooked

+1

Oh yeah, tôi cũng đặt 'ha = 'center'' vào' chú thích'. – imsc

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