2017-06-01 5 views
5

का उपयोग कर स्टैक्ड बार प्लॉट मैं matplotlib का उपयोग करके बार प्लॉट उत्पन्न कर रहा हूं और ऐसा लगता है कि स्टैक्ड बार प्लॉट के साथ एक बग है। प्रत्येक लंबवत ढेर के लिए योग 100 होना चाहिए। हालांकि, एक्स-एक्सिस के लिए 65, 70,75 और 80 के लिए हम पूरी तरह से मनमाना परिणाम प्राप्त करते हैं जो कोई समझ नहीं लेते हैं। मुझे समझ में नहीं आता कि समस्या क्या है। कृपया नीचे MWE खोजें।matplotlib

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib 
header = ['a','b','c','d'] 
dataset= [('60.0', '65.0', '70.0', '75.0', '80.0', '85.0', '90.0', '95.0', '100.0', '105.0', '110.0', '115.0', '120.0', '125.0', '130.0', '135.0', '140.0', '145.0', '150.0', '155.0', '160.0', '165.0', '170.0', '175.0', '180.0', '185.0', '190.0', '195.0', '200.0'), (0.0, 25.0, 48.93617021276596, 83.01886792452831, 66.66666666666666, 66.66666666666666, 70.96774193548387, 84.61538461538461, 93.33333333333333, 85.0, 92.85714285714286, 93.75, 95.0, 100.0, 100.0, 100.0, 100.0, 80.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0), (0.0, 50.0, 36.17021276595745, 11.320754716981133, 26.666666666666668, 33.33333333333333, 29.03225806451613, 15.384615384615385, 6.666666666666667, 15.0, 7.142857142857142, 6.25, 5.0, 0.0, 0.0, 0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), (0.0, 12.5, 10.638297872340425, 3.7735849056603774, 4.444444444444445, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), (100.0, 12.5, 4.25531914893617, 1.8867924528301887, 2.2222222222222223, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)] 
X_AXIS = dataset[0] 

matplotlib.rc('font', serif='Helvetica Neue') 
matplotlib.rc('text', usetex='false') 
matplotlib.rcParams.update({'font.size': 40}) 

fig = matplotlib.pyplot.gcf() 
fig.set_size_inches(18.5, 10.5) 

configs = dataset[0] 
N = len(configs) 
ind = np.arange(N) 
width = 0.4 

p1 = plt.bar(ind, dataset[1], width, color='r') 
p2 = plt.bar(ind, dataset[2], width, bottom=dataset[1], color='b') 
p3 = plt.bar(ind, dataset[3], width, bottom=dataset[2], color='g') 
p4 = plt.bar(ind, dataset[4], width, bottom=dataset[3], color='c') 

plt.ylim([0,120]) 
plt.yticks(fontsize=12) 
plt.ylabel(output, fontsize=12) 
plt.xticks(ind, X_AXIS, fontsize=12, rotation=90) 
plt.xlabel('test', fontsize=12) 
plt.legend((p1[0], p2[0], p3[0], p4[0]), (header[0], header[1], header[2], header[3]), fontsize=12, ncol=4, framealpha=0, fancybox=True) 
plt.show() 

enter image description here

उत्तर

5

आप प्रत्येक डेटासेट के bottom जरूरत है सभी डेटासेट कि पहले आया था की राशि होने के लिए। आपको डेटासेट को एक साथ जोड़ने के लिए numpy arrays में कनवर्ट करने की आवश्यकता हो सकती है।

p1 = plt.bar(ind, dataset[1], width, color='r') 
p2 = plt.bar(ind, dataset[2], width, bottom=dataset[1], color='b') 
p3 = plt.bar(ind, dataset[3], width, 
      bottom=np.array(dataset[1])+np.array(dataset[2]), color='g') 
p4 = plt.bar(ind, dataset[4], width, 
      bottom=np.array(dataset[1])+np.array(dataset[2])+np.array(dataset[3]), 
      color='c') 

enter image description here

वैकल्पिक रूप से, आप सरणियों Numpy करने से पहले आप की साजिश रचने शुरू उन्हें परिवर्तित कर सकते हैं।

dataset1 = np.array(dataset[1]) 
dataset2 = np.array(dataset[2]) 
dataset3 = np.array(dataset[3]) 
dataset4 = np.array(dataset[4]) 

p1 = plt.bar(ind, dataset1, width, color='r') 
p2 = plt.bar(ind, dataset2, width, bottom=dataset1, color='b') 
p3 = plt.bar(ind, dataset3, width, bottom=dataset1+dataset2, color='g') 
p4 = plt.bar(ind, dataset4, width, bottom=dataset1+dataset2+dataset3, 
      color='c') 

या अंत में अगर आप सरणियों Numpy में कनवर्ट करने से बचना चाहते हैं, आप एक सूची समझ इस्तेमाल कर सकते हैं:

p1 = plt.bar(ind, dataset[1], width, color='r') 
p2 = plt.bar(ind, dataset[2], width, bottom=dataset[1], color='b') 
p3 = plt.bar(ind, dataset[3], width, 
      bottom=[sum(x) for x in zip(dataset[1],dataset[2])], color='g') 
p4 = plt.bar(ind, dataset[4], width, 
      bottom=[sum(x) for x in zip(dataset[1],dataset[2],dataset[3])], 
      color='c') 
+1

क्यों numpy सरणी? – tandem

+1

तो आप उन्हें एक साथ जोड़ सकते हैं, तत्व-वार। निश्चित रूप से आप इसे एक सूची समझ के साथ कर सकते हैं, लेकिन numpy इसे आसान बनाता है – tom

+0

आप साजिश करने से पहले, उन्हें जगह में सहेजने और रूपांतरण को दोहराने के लिए उन्हें स्पष्ट रूप से numpy arrays में परिवर्तित कर सकते हैं। – tom