我试图遍历models.py中的Django Class对象,以便根据存储在另一个db中的信息创建一个与每个Class对象相关的饼图。
在命令提示符下运行shell,我输入:
from file.models import Person, piemaker
for i in Person.objects.all():
i.piegraph = i.pgraph()
i.save()
这样做时,我得到一个饼图作为我的Person类中每个对象的png文件;然而,看起来这些图形是一个在另一个上面而不是作为单个图形弹出。像标签一样重复并且彼此重叠。
我被困在这个被打破的地方,但我的猜测是在我的for循环中?当我只在一个类对象上运行piemaker函数时,它会吐出包含一个漂亮的饼图的正确的png文件。
from file.models import Person, piemaker
a = Person.objects.get(name='name')
a.piegraph = a.pgraph()
a.save()
我一直在研究这两天,但没有用。任何帮助,将不胜感激。
#!python3
###import statements####
from django.db import models
import pandas as pd
import sqlite3
import re
import matplotlib.pyplot as plt
##global start and end variables####
start = '2015-01-01'
end = '2016-01-01'
####fux for making, saving dynamic piegraph file
def piemaker(pietag):
try:
####file to save as####
filename = 'C:\\users\\user\\PycharmProjects\\Test2\\media_cdn\\pie-' + pietag + start + end+'.png'
####file name to return for Django FileField####
file = 'pie-' + pietag + start + end+'.png'
###read my db which is external to Django to get parameters for pie graph
df = pd.read_sql_query("SELECT * FROM db WHERE " + pietag + " = 1 AND post_date >= '" + str(start) + "' AND post_date <= '" + str(end) + "'", conn)
df.drop(['sets'], axis=1, inplace=True)
df = df.astype(int)
df = df.loc[:, (df !=0).any(axis=0)]
sums = df.sum()
sums.sort_values(ascending=False, inplace=True)
other = 0
for i in sums[3:]:
other += i
sums['other'] = other
sums.sort_values(ascending=False, inplace=True)
pie = sums.drop(sums[4:].keys())
plt.title('Texts/tags associated with ' + pietag + ' between: ' + start + '-' + end)
plt.pie(pie,labels=pie.keys(), explode= (0,.15,0,0), startangle=90, autopct=make_autopct(pie))
plt.savefig(filename, bbox_inches='tight')
return file
except ValueError:
return 'nothing here'
class Person(models.Model):
def __str__(self):
return self.name
@property
def tag(self):
return self.name.lower().replace(' ', '_')
def pgraph(self):
return(piemaker(self.tag))
name = models.CharField(max_length=50, unique=True)
tags = models.TextField(default='tag')
piegraph = models.FileField(null=True, blank=True)
答案 0 :(得分:0)
我认为您的问题是您正在尝试使用matplotlib的交互式版本。这将导致非常奇怪的结果。相反,您需要使用Figure对象并执行以下操作:
properties