2013-04-24 25 views
0

我正嘗試使用matplotlib生成版本數據的堆棧圖。我有那部分工作並正常顯示,但我無法讓圖例顯示角落以外的任何其他地方。stackplot圖例的空方塊

ra_ys = np.asarray(ra_ys) 

# Going to generate a stack plot of the version stats 
fig = plt.figure() 

ra_plot = fig.add_subplot(111) 

# Our x axis is going to be the dates, but we need them as numbers 
x = [date2num(date) for date in dates] 

# Plot the data 
ra_plot.stackplot(x, ra_ys) 

# Setup our legends 
ra_plot.legend(ra_versions) #Also tried converting to a tuple 
ra_plot.set_title("blah blah words") 
print(ra_versions) 

# Only want x ticks on the dates we supplied, and want them to display AS dates 
ra_plot.set_xticks(x) 
ra_plot.set_xticklabels([date.strftime("%m-%d") for date in dates]) 

plt.show() 

ra_ys是一個多維數組:

[[ 2 2 2 2 2 2 2 2 2 2 1] 
[ 1 1 1 1 1 1 1 1 1 1 1] 
[ 1 1 1 1 1 1 1 1 1 1 1] 
[53 52 51 50 50 49 48 48 48 48 47] 
[18 19 20 20 20 20 21 21 21 21 21] 
[ 0 0 12 15 17 18 19 19 19 19 22] 
[ 5 5 3 3 3 3 3 3 3 3 3] 
[ 4 4 3 3 2 2 2 2 2 2 2] 
[14 14 6 4 3 3 2 2 2 2 2] 
[ 1 1 1 1 1 1 1 1 1 1 1] 
[ 1 1 1 1 1 1 1 1 1 1 1] 
[ 1 1 1 1 1 1 1 1 1 1 1] 
[ 2 2 2 2 2 2 2 2 2 2 2] 
[ 1 1 1 1 1 1 1 1 1 1 1] 
[ 1 1 1 1 1 1 1 1 1 1 1] 
[ 3 3 2 2 2 2 2 2 2 2 2]]           

x是一些日期:[734969.0, 734970.0, 734973.0, 734974.0, 734975.0, 734976.0, 734977.0, 734978.0, 734979.0, 734980.0, 734981.0]

ra_versions是一個列表:['4.5.2', '4.5.7', '4.5.8', '5.0.0', '5.0.1', '5.0.10', '5.0.7', '5.0.8', '5.0.9', '5.9.105', '5.9.26', '5.9.27', '5.9.29', '5.9.31', '5.9.32', '5.9.34']

難道我做錯了什麼?可以堆積的地塊沒有傳說嗎?

編輯:我試圖打印把手和標籤的情節,得到了兩個空列表([] []):

handles, labels = theplot.get_legend_handles_labels() 
print(handles,labels) 

我再使用後續代碼的代理手柄測試相同的數字,它的工作。所以它看起來像缺乏手柄是問題。

p = plt.Rectangle((0, 0), 1, 1, fc="r") 
theplot.legend([p], ['test']) 

所以,現在的問題是,我怎麼能生成可變數量的匹配我的垛積的色彩,代理手柄?

回答

0

這是獲得圖例的最終(更清晰)的方法。由於沒有句柄,我爲每一行生成代理藝術家。理論上它能夠處理重複使用顏色的情況,但這會造成混淆。

def plot_version_data(title, dates, versions, version_ys, savename=None): 
    print("Prepping plot for \"{0}\"".format(title)) 
    fig = plt.figure()  
    theplot = fig.add_subplot(111) 

    # Our x axis is going to be the dates, but we need them as numbers 
    x = [date2num(date) for date in dates] 

    # Use these colors 
    colormap = "bgrcmy" 
    theplot.stackplot(x, version_ys, colors=colormap) 

    # Make some proxy artists for the legend 
    p = [] 
    i = 0 
    for _ in versions: 
     p.append(plt.Rectangle((0, 0), 1, 1, fc=colormap[i])) 
     i = (i + 1) % len(colormap) 

    theplot.legend(p, versions) 
    theplot.set_ylabel(versions) # Cheating way to handle the legend 

    theplot.set_title(title) 

    # Setup the X axis - rotate to keep from overlapping, display like Oct-16, 
    # make sure there's no random whitespace on either end 
    plt.xticks(rotation=315) 
    theplot.set_xticks(x) 
    theplot.set_xticklabels([date.strftime("%b-%d") for date in dates]) 
    plt.xlim(x[0],x[-1]) 

    if savename: 
     print("Saving output as \"{0}\"".format(savename)) 
     fig.savefig(os.path.join(sys.path[0], savename)) 
    else: 
     plt.show()