2016-01-23 95 views
0

我有幾個使用matplotlib創建的子圖。一旦我繪製數據,我需要返回並在for循環中的數據點之間畫線。我的數據文件很大,這需要蟒蛇很長一段時間...matplotlib加快循環中的繪圖線

有沒有辦法加快速度?這裏是我的代碼:

def generateHistogram(x, y, ax): 
    x = np.log10(x) 
    xerror = [] 

    numData = len(x) 

    plt.rcParams['lines.solid_capstyle'] = 'butt' 

    for dataIndex in range(0, numData-1): 
     xerror.append(np.divide(np.subtract(x[dataIndex+1], x[dataIndex]), 2.0)) 

    for errorIndex in range(0, len(x)): 
     if (errorIndex == 0): 
      ax.semilogx((np.power(10, (x[errorIndex]-xerror[errorIndex])), np.power(10, x[errorIndex])), 
         (y[errorIndex], y[errorIndex]), linewidth=2, color='k') 

     if (errorIndex == len(xerror)): 
      ax.semilogx((np.power(10, x[errorIndex]), np.power(10, (x[errorIndex]+xerror[errorIndex-1]))), 
         (y[errorIndex], y[errorIndex]), linewidth=2, color='k') 

     if (errorIndex < len(xerror)): 
      ax.semilogx((np.power(10, x[errorIndex]), np.power(10, (x[errorIndex]+xerror[errorIndex]))), 
         (y[errorIndex], y[errorIndex]), linewidth=2, color='k') 
      ax.semilogx((np.power(10, (x[errorIndex+1]-xerror[errorIndex])), np.power(10, x[errorIndex+1])), 
         (y[errorIndex+1], y[errorIndex+1]), linewidth=2, color='k') 

      verticleLineXPos = np.power(10, (x[errorIndex]+xerror[errorIndex])) 
      ax.semilogx((verticleLineXPos, verticleLineXPos), (y[errorIndex], y[errorIndex+1]), 
         linewidth=2, color='k') 


    return xerror; 

這基本上借鑑了各自在我需要的位置次要情節(其中x軸是在semilogx規模)的線。你有任何改善表現的建議嗎?

+0

你能否提供一個_minimal_例子,說明在這種情況下x和y是什麼樣的數據結構?如果這些是一維數組,你的第一個循環是'xerror = np.diff(x)/ 2'。你能發表你想要做什麼的照片嗎?你可能也想看看一個'LineCollection'藝術家。 – tacaswell

+0

x,y和xerror數據結構都只是一個浮點列表。這些循環用於計算我需要繪製的線的長度和位置。這個細節對這個問題並不重要。 我在問如何在matplotlib的情節中高效地繪製多條線。 LineCollection實際上在繪製每個表現的過程中是否會提高性能?有沒有辦法讓速度更快? – grover

+0

這可能會更好地放在http://codereview.stackexchange.com – tom

回答