2016-04-01 8 views
0

Python ve matplotlib için neredeyse yepyeni bir durumdayım ve bu yüzden tamamlamak istediğim bir grafik için Python belgelerinden bir örnek uyarlamaya çalışıyorum. Ancak, rect1 ve rect2 çağrıları için ve ax.text'daki balta için tanımlanmamış ad hataları alıyorum. İşlev tanımları arasında aktarılmayan değerlerle ilgili bir şey olduğu hissine sahibim, ancak doğru sözdizimini anlayamıyorum. Herhangi bir fikir?Matplotlib değişken sorunları

P.S. Gerekirse ek bilgi sağlayabilirim; Bu benim ilk mesajım bu.

from inventoryClass import stockItem 

import numpy as np 
import matplotlib.pyplot as plt 

def plotInventory(itemRecords): 

    stockBegin = [] 
    stockFinish = []  
    stockID = []  
    stockItems = [] 
    for rec in itemRecords.values() : 
     stockBegin.append(rec.getStockStart) 
     stockFinish.append(rec.getStockOnHand) 
     stockID.append(rec.getID) 
     stockItems.append(rec.getName) 
    N = len(stockBegin)  


ind = np.arange(N) # the x locations for the groups 
width = 0.35  # the width of the bars 

fig, ax = plt.subplots() 
rects1 = ax.bar(ind, stockBegin, width, color='r') 
rects2 = ax.bar(ind + width, stockFinish, width, color='y') 

# add some text for labels, title and axes ticks 
ax.set_ylabel('Inventory') 
ax.set_title('Stock start and end inventory, by item') 
ax.set_xticks(ind + width) 
ax.set_xticklabels((str(stockID[0]), str(stockID[1]), str(stockID[1]))) 

ax.legend((rects1[0], rects2[0]), ('Start', 'End')) 

def autolabel(rects) : 

    for rect in rects : 
     height = rect.get_height() 
     ax.text(rect.get_x() + rect.get_width()/2., 1.05*height, 
      '%d' % int(height), 
      ha='center', va='bottom') 

autolabel(rects1) 
autolabel(rects2) 

plt.show() 

cevap

0

değişkenler rects1 ve rects2 sadece plotInventory kapsamında mevcut ve böylece piton sen 'rects1' tarafından bahsettiğin şey bilmiyor.

  1. yapabilirsiniz küresel kapsamda mevcut değerler böylece dönüş: Sadece plotInventory içinden OtomatikEtiketle çağırabilir

    def plotInventory(itemRecords): 
        # ... code ... # 
        return rects1, rects2 
    
    rects1, rects2 = plotInventory(records) 
    autolabel(rects1) 
    autolabel(rects2) 
    
    plt.show() 
    
  2. :

    Bunu düzeltmek için iki olası yolu vardır balta gelince
    def plotInventory(itemRecords): 
        # ... code ... # 
        autolabel(rects1) 
        autolabel(rects2) 
    

, aynı pr si örneğin oblem ve OtomatikEtiketle içine balta geçmesine gerek dışında aynı çözümleri,:

def autolabel(ax, rects): 
    # ... code ... # 

ax, rects1, rects2 = plotInventory(records) 
autolabel(ax, rects1) 
autolabel(ax, rects2) 

yanı plotInventory gelen balta geri vermeyi unutmayın!

+0

Yardımın için teşekkürler, bu gerçekten sorunumu çözüyor. Şerefe! –