2012-07-17 28 views
11

में सांख्यिकीय रूप से महत्वपूर्ण अंतर को इंगित करते हुए मैं प्रत्येक समूह के डेटा को इंगित करने के लिए बार ग्राफ़ का उपयोग करता हूं। इनमें से कुछ बार एक दूसरे से काफी अलग हैं। मैं बार साजिश में महत्वपूर्ण अंतर कैसे इंगित कर सकता हूं?बार ग्राफ़

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

मैं के लिए

enter image description here

+0

केवल तुलना स्थानीय स्तर पर आसन्न किए जाने के लिए कर रहे हैं? यही है, क्या आप केवल '(ए, बी) (बी, सी) (सी, डी)' के बीच का अंतर दिखाना चाहते हैं, लेकिन '(ए, सी)' नहीं? – Hooked

+0

नहीं, मैं सभी संभावित जोड़े के बीच तुलना करना चाहता हूं। – imsc

+1

चार्ट पर इसे दिखाना मुश्किल हो सकता है, खासकर यदि बड़ी संख्या में आइटम हैं। यदि आपके पास एन = 10 है, तो आइटम 45 अलग-अलग जोड़ों की तुलना में हैं! ऐसा लगता है जैसे आप अपने pairwise पी मानों को इसके बजाय मैट्रिक्स पर प्रदर्शित कर सकते हैं। क्या यह काम करेगा? – Hooked

उत्तर

14

लक्ष्य कर रहा हूँ मैं चीजों है कि यहाँ मेरा सुझाव है जब जटिल भूखंडों के साथ काम करने की एक जोड़ी किया है। एक शब्दकोश में कस्टम स्वरूपण को खींचें, जब आप पैरामीटर बदलना चाहते हैं तो यह जीवन को सरल बनाता है - और आप इस शब्दकोश को एकाधिक प्लॉट्स में पास कर सकते हैं। मैंने annotate पर एक कस्टम फ़ंक्शन भी लिखा है, बोनस के रूप में यह (A,C) के बीच एनोटेट कर सकता है यदि आप वास्तव में चाहते हैं (मैं अपनी टिप्पणी से खड़ा हूं कि यह सही दृश्य दृष्टिकोण नहीं है)। डेटा बदलने के बाद इसे कुछ ट्वीविंग की आवश्यकता हो सकती है लेकिन इससे आपको सही रास्ते पर रखा जाना चाहिए।

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

बहुत बहुत धन्यवाद। बहुत सूचनाप्रद। मैं बस 'ax.annotate (टेक्स्ट, xy = (एक्स [i], y + 7), zorder = 10)' to 'ax.annotate (टेक्स्ट, xy = (x, y + 7), zorder = 10) को बदलता हूं पी-मूल्य केंद्रित करने के लिए। – imsc

+0

@imsc यही मैंने पहले उपयोग किया था, लेकिन यह टेक्स्ट ब्लॉक के बाईं ओर का स्थान है - टेक्स्ट ब्लॉक का केंद्र नहीं। मेरे लिए ऐसा लगता है कि उस प्लेसमेंट के साथ थोड़ा सा केंद्र है। किसी भी तरह से, मुझे आशा है कि आप देखेंगे कि आप कैसे ट्विक कर सकते हैं! – Hooked

+1

ओह हाँ, मैंने 'एनोटेट 'में' हे = 'सेंटर' रखा है। – imsc