2013-04-24 49 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()