Matplotlib堆叠条仅在每次点击时出现

时间:2015-09-22 19:07:45

标签: python django matplotlib

我目前正在开发一个django项目,该项目允许用户使用matplotlib创建多个图表,并从数据库中获取数据。 一切都按预期工作,除了堆叠条,只有用户在网站上单击创建时才会出现。 我不知道为什么图表会在第一次尝试时出现,而在第二次它只显示带有图例但没有数据的图表。

希望有人可以帮助我,这让我疯狂......

这是我创建图表的代码:

import matplotlib
matplotlib.use('Agg')
import math
import pylab
from pylab import *
from matplotlib import pyplot as plt
from matplotlib import style
from matplotlib import colors
from matplotlib.dates import DateFormatter
import matplotlib.dates as dates
import numpy as np
import matplotlib.ticker as ticker
import datetime
from operator import itemgetter
import matplotlib.cm as cm
import numpy as np
import time

class Colors(object):
    def __init__(self):
        self.colors = cm.get_cmap('Blues')
        self.rcolors = cm.get_cmap('Blues_r')   
    def setColors(self, color=None):
        if color:
            self.colors = cm.get_cmap(color)
            self.rcolors = cm.get_cmap('{0}_r'.format(color))

class Diagram(Colors):
    def __init__(self, **kwargs):
        super(Diagram, self).__init__()
        self.plt = plt
        self.plt.figure(figsize=(15,15))

    def create(self, **kwargs):
        pass

    def __del__(self):
        self.plt.close()

class StackedBar(Diagram):
    def __init__(self, ylimit=None):
        super(StackedBar, self).__init__()
        self.ax = plt.gca()
        if ylimit:
            self.ax.set_ylim([0, ylimit])

    def create(self, *args, **kwargs):
        if kwargs:

            plots = []
            data = zip(kwargs['labels'], kwargs['x'],kwargs['y'])

            for i, d in enumerate(data):
                plots.append(self.ax.bar(np.array(d[1]), np.array(d[2]), label=d[0], color=self.rcolors(1.*i/len(kwargs['labels'])) ,align='center'))

            self.ax.set_xlabel('Date')
            self.ax.set_ylabel('Amount used')
            self.ax.xaxis_date()
            self.ax.xaxis.set_major_formatter(DateFormatter('%d, %b, %Y'))
            plt.setp(self.ax.get_xticklabels(), fontsize=10, rotation=45, ha='right')
            plt.legend(plots, kwargs['labels'])
            time.sleep(0.5)

    def save(self, **kwargs):
        plt.title('\n'.join(kwargs['title'].split('|')).title())
        plt.savefig(kwargs['savepath'].format(''.join([kwargs['title'], 'sbar'])), bbox_inches='tight')
        return ''.join([kwargs['title'], 'sbar', '.png'])

类StackedBar由djangos views.py调用,它将从数据库获取的数据传递给create方法。当调用save函数时,它返回模板中用于加载图片的文件名。

以下是一些示例数据:

def main():
    adict = {   'x'      : [[datetime.date(2015, 9, 19), datetime.date(2015, 9, 20)],
                            [datetime.date(2015, 9, 22)], [datetime.date(2015, 9, 21)]],
                'y'      : [[1, 2], [2], [1]],
                'labels' : [u'Test1', u'Test2', u'Test3'],
                }
    for i in range(10):
        s = StackedBar()
        s.create(**adict)
        s.save(**{'title' : 'test{0}'.format(i), 'savepath' : '/savepath/{0}'})
        del s

if __name__ == "__main__":
    main()

和一些截图:

首次加载和重新加载 on load on reload

为什么matplotlib对我这样做? :(

编辑说:奇怪的是,如果我在shell中测试代码它没有任何问题。

1 个答案:

答案 0 :(得分:0)

class Diagram(Colors):
    def __init__(self, **kwargs):
        super(Diagram, self).__init__()
        self.plt = plt
        self.plt.figure(figsize=(15,15))

    def create(self, **kwargs):
        pass

    def __del__(self):
        self.plt = None

是解决方案