多个字典重构用于 matplotlib 绘图。

3
我最近使用 PyNE 库 对复杂材料的放射性衰变进行建模。除其他之外,该库允许您将任意材料定义为字典,通过时间 t 进行衰变,然后它会返回一个新的材料字典,其中包含该时刻存在的种类及其浓度。对于一次操作,这很简单。但是,如果您想重复这个过程(衰变)多次,您将得到多个不同的字典。这些字典中的数据显示了放射性物质如何随时间演变(衰变)。
这很好,但我真正想做的是将每种物质作为时间函数绘制出来。但是,matplotlib 绘图不接受多个字典作为输入数据。
我的问题是,如何以 Pythonic 的方式重新排列多个字典,以便按照 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个回答

3
我认为你需要使用pandas DataFrame,它是专门用于处理带有标签数据的二维数组的工具,能够自动对齐数据、方便地处理缺失数据,并与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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接