Stackplot的传奇的空广场

时间:2013-04-24 15:13:25

标签: python-3.x matplotlib plot legend

我试图使用matplotlib生成版本数据的堆栈图。我有一部分正常工作和显示,但是我无法让传奇显示角落里的空方块以外的任何东西。

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'])

现在的问题是,如何生成与我的堆栈图颜色相匹配的可变数量的代理句柄?

1 个答案:

答案 0 :(得分: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()