将Matplotlib绘图图像保存到Django模型中

时间:2016-02-23 15:21:06

标签: python django matplotlib plot

出于学习目的,我正在创建一个使用matplotlib制作绘图的webapp,并且我想将该绘图的图像保存到Plot模型的figure字段中,但是当我创建一个绘图时它是否将空白图像保存到/media/figures/目录中。我按照其他帖子建议的方式这样做,但它没有用。

更多信息 当我创建绘图时,绘图图像将保存在我的django项目的主目录中,其名称为<_io.StringIO object at 0xb1ac69ec>,但正如我所说,保存在模型中的绘图图像是空白的。如果重要的话,我也使用 Python 2.7

def simple_plot(request):
    if request.method == "POST":
        name = request.POST.get("name")
        xvalues = request.POST.get("xvalues")
        yvalues = request.POST.get("yvalues")
        plots.simple_plot(request, name, xvalues, yvalues)
        messages.success(request, "Plot created!")
        redirect("plots:create")
    return render(request, 'plots/simple.html')

创建绘图的文件和创建的绘图实例。

def simple_plot(request ,name, xvalues, yvalues):
    file_name = name+".png"
    xvalues = [int(x.replace(" ","")) for x in xvalues.split(",")]
    yvalues = [int(y.replace(" ","")) for y in yvalues.split(",")]

    figure = io.StringIO()
    plot = plt.plot(xvalues, yvalues)
    plt.savefig(u'%s' % figure, format="png")

    content_file = ContentFile(figure.getvalue())
    plot_instance = Plot(name=name, user=request.user)
    plot_instance.figure.save(file_name, content_file)
    plot_instance.save()
    return True

Plot Model

class Plot(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    figure = models.ImageField(upload_to='figures/')
    timestamp = models.DateTimeField(auto_now_add=True)

2 个答案:

答案 0 :(得分:5)

您的代码存在一些问题:

  • 您不应将数字保存为StringIO,而应保存为io.BytesIO()。这是因为PNG文件的内容不是人类可读的文本,而是二进制数据。

  • 另一个问题是如何在将BytesIO传递给StringIO时处理savefig(代码中的BytesIO)。 u'%s' % figure与文件没有关联(具有内存文件类对象的全部意义),因此它没有文件名 - 这是我想你想通过那个django.core.files.images.ImageFile表达来得到什么。相反,只需写入类似文件的对象。

  • 第三,使用ContentFile代替BytesIO。另外,使用figure = io.BytesIO() plt.plot(xvalues, yvalues) plt.savefig(figure, format="png") content_file = ImageFile(figure) 对象本身初始化它,而不是它的字节值。

然后代码的相关部分变为:

MP,Party,Constituency,Status
"Abbott, Diane",Labour,Hackney North and Stoke Newington,Remain
"Abrahams, Debbie",Labour,Oldham East and Saddleworth,Remain
"Adams, Nigel",Conservative,Selby and Ainsty,Leave

答案 1 :(得分:1)

您可能还想尝试使用图表库 - 他们有一个可以添加到html(https://plot.ly/javascript/getting-started/)的js脚本,并且您始终可以序列化需要导入图表的数组