首先 - 我的目标是:我想在matplotlib中生成条形图,然后从Django模型中获取数据。
为了获得一组解释的数据,我必须将它们与来自其他模型的数据相乘。这就是为什么我不能通过查询集排序(至少我认为我不能)
这给我留下了两个列表(每年一次):标签 - 字符串 - 和数据 - 浮点数 -
我很容易用sort(data)
对数据进行排序,但这显然不会改变标签的顺序。
我想到的第一件事就是像词典这样的词典是不可变的。
有一种订购字典的方法 - collections是一个了不起的图书馆 - 但令我困扰的是,我必须打包一本字典,而不是通过
订购字典。OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
然后在两个列表中再次解压缩,将其交给函数
matplotlib.bar(x, values, labels=keys)
对我而言,这似乎非常不优雅,我必须这样做4次(4年的数据)
你会如何解决这个问题?
修改: 关于Django模型的更多信息(草图;))
class EnergieSource(Models):
name = models.CharField(max_length=30)
co2 = models.FloatField('CO²-Equivalent')
class EnergieUsage(Models):
date = models.DateField('Year')
energiesource = models.ForeignKeyField(EnergieSource)
usage = models.FloatField('Yearly use in MWh')
不,我将usage
与co2
相乘,并根据EnergySource改变数据。
答案 0 :(得分:1)
感谢jonrsharpe和martin,我找到了答案,我想分享一下:
#Zip the list
sort_year = list(zip(values, labels))
#Sortig the list
sort_year.sort()
#pitfall: the list will be in reversed order
values, labels = zip(*sort_year)
你去了 - 从大多数到最不重要 - 我完全惊讶!
答案 1 :(得分:1)
我认为另一种可能的解决方案是使用numpy数组:
import numpy as np
values = np.array(values)
labels = np.array(labels)
sort_vec = np.argsort( values )[::-1]
values = values[ sort_vec ]
labels = labels[ sort_vec ]