为matplotlib情节

时间:2016-03-17 23:44:24

标签: python python-2.7 dictionary matplotlib

我最近一直在使用PyNE library模拟复杂材料的放射性衰变。除此之外,这个库允许您将任意材料定义为字典,在时间t内将其衰减,然后它将返回一个新材料作为包含当时存在的物种及其浓度的字典。对于一次性操作,这很简单。但是,如果您想多次重复该过程(衰减),您最终会得到几个词典。这些词典中的数据显示放射性物质如何随时间演变(衰变)。

这很好,但是,我真正想做的是将每个物种作为时间的函数。但是,matplotlib图不会接受多个字典作为输入数据。

我的问题是,如何以pyponic方式重新排列多个词典,以显示每个物种随时间的演变,matplotlib绘图格式会接受?

让我举个例子。假设我的初始材料在T0定义,由三个物种组成,每个物种的数量为1.0。我的初始字典看起来像:

T0 = {A:1.0, B:1.0, C:1.0}

现在假设我将这种材料腐烂到T1,新材料可能是。

T1 = {A:1.0, B:0.35, C:1.0, D:0.75}

我们可以看到物种B已经腐烂而产生D,但是A和C都没有。

现在让它再次腐烂到T2

T2 = {A:0.9, C:0.8, D:1.0, E:0.1, F:0.2}

这次物种B完全腐烂到D而A和C开始腐烂到E和F.

现在很明显我只展示了三个简单案例。实际上,将有数百个词典,可能还有数十个物种。在示例中,我想将A,B,C,D,E绘制为时间的函数。由于数据位于每个时间步骤定义的单独词典中,因此Matplotlib图不会将其作为输入参数。我需要的是将所有A数据组合在一起并根据时间绘制它,将所有B数据组合在一起并根据时间绘制它等等...

我的第一个想法是附加到2D列表,其中列基本上是时间而行是物种。当提取到矢量时,可以很容易地绘制它们。但是我认为对于出现在中途的物种来说这可能是困难的,例如上面的D,E,F。您需要将它们设置为零,如下所示:

list = [['Time', T0, T1, T2],
['A', 1.0, 1.0, 0.9],
['B', 1.0, 0.35, 0.9],
['C', 1.0, 1.0, 0.8],
['D', 0.0, 0.0, 0.9],
['E, 0.0, 0.0, 0.9]]

关于如何以简洁的pythonic方式操纵这些词典的任何想法都会非常受欢迎。

标记

1 个答案:

答案 0 :(得分:3)

我认为您需要pandas DataFrame,它设计用于标记数据的2D数组,具有自动对齐功能,可以方便地处理缺失的数据和matplotlib集成。

http://pandas.pydata.org/

T0 = {'A':1.0, 'B':1.0, 'C':1.0}
T1 = {'A':1.0, 'B':0.35, 'C':1.0, 'D':0.75}
T2 = {'A':0.9, 'C':0.8, 'D':1.0, 'E':0.1, 'F':0.2}
T3 = {'C':0.6, 'D':0.8, 'E':0.1, 'F':0.2}

df = pd.DataFrame([T0, T1, T2, T3]).fillna(0)
print(df)

     A     B    C     D    E    F
0  1.0  1.00  1.0  0.00  0.0  0.0
1  1.0  0.35  1.0  0.75  0.0  0.0
2  0.9  0.00  0.8  1.00  0.1  0.2
3  0.0  0.00  0.6  0.80  0.1  0.2

df.plot(style='o-')

decay