获取饼图数据
说,我有一个模型,它定义了一个汽车,它的一个领域是'制造商'。例如:获取饼图数据
class Car(models.Model):
manufacturer = models.CharField(max_length=50)
color = models.CharField(max_length=50)
licence_plate = models.CharField(max_length=50)
.
.
.
要绘制一个饼图来显示各个制造商的总数(使用matplotlib),我需要两个列表。一个包含制造商总数,另一个包含相应的制造商名称。所以我想结束这样的事情。
[516, 122, 131, 125, ...
['Ford','BMW','Mazda','Honda', ...
顺便说一下,我不知道制造商的名称事先。
还有一件事,我只想显示前5名制造商。所有其他人应该被集中在一个名为“其他”的制造商。
我如何获得这些列表?
不知道这是完全正确的,但你需要像:
from django.db.models import Count, Sum
num_taken = 5 # modify this if you want more/less than 5
query = Car.objects.values('manufacturer').annotate(num_cars=Count('manufacturer')).order_by('-num_cars')
top_cars = query[:num_taken]
others = query[num_taken:].aggregate(total=Sum('num_cars'))['total']
car_nums = [entry['num_cars'] for entry in top_cars] + [others]
car_manufactureres = [entry['manufacturerer'] for entry in top_cars] + ['Others']
谢谢,这非常接近。但是,我不希望忽略未进入前五名的制造商的总数。我想将所有低于前五名的选手放在另一个名为“其他”的组中。 – gerty 2011-06-01 07:46:01
@gerty查看编辑 – 2011-06-01 07:48:15
这里是一个纯Python(你处理Django的东西)的解决方案。我自己做了一些汽车对象来测试代码。
from random import choice
from collections import defaultdict
from operator import itemgetter
manufacturers = ["Ford", "BMW", "Mazda", "Honda", "Volvo", "Saab", "Toyota"]
cars = [type("Car", (object,), {"manufacturer": choice(manufacturers)})
for x in range(1000)]
count = defaultdict(int)
for car in cars:
count[car.manufacturer] += 1
top = sorted(count.items(), key=itemgetter(1), reverse=True)
other = sum(x[1] for x in top[5:])
list1 = [x[0] for x in top[:5]] + ["other"]
list2 = [x[1] for x in top[:5]] + [other]
print list1
print list2
这很有帮助。 – gerty 2011-06-01 13:01:11
最初存储的数据如何? – Tim 2011-06-01 07:25:09
你还没有说过你应该从哪里得到总数的数字。那是否存储在Car的另一个属性中?或者你数一下汽车的数量? – 2011-06-01 07:26:47
@Tim我已经解决了这个问题。 – gerty 2011-06-01 07:28:29