Python 在matplotlib中的嵌套字典数据上创建图形(绘图)

Python 在matplotlib中的嵌套字典数据上创建图形(绘图),python,dictionary,matplotlib,Python,Dictionary,Matplotlib,我可以根据“简单”字典在matplotlib中构建简单绘图: import matplotlib.pyplot as plt D = {u'Label1':26, u'Label2': 17, u'Label3':30} plt.bar(range(len(D)), D.values(), align='center') plt.xticks(range(len(D)), D.keys()) 但是,我如何在这些字典的数据上创建两个图形,一个是我不知道的绘图 NG1={'need1': [{'

我可以根据“简单”字典在matplotlib中构建简单绘图:

import matplotlib.pyplot as plt
D = {u'Label1':26, u'Label2': 17, u'Label3':30}
plt.bar(range(len(D)), D.values(), align='center')
plt.xticks(range(len(D)), D.keys())

但是,我如何在这些字典的数据上创建两个图形,一个是我不知道的绘图

NG1={'need1': [{'good1': 3, 'good2': 4}], 'need2': [{'good2': 2, 'good3': 2}]}
NG2={'need1': [{'good1': 13, 'good2': 23}], 'need2': [{'good2': 8, 'good3': 14}]}
如下图所示


使用
pandas
您可以大致完成我认为您需要的操作

NG1={'need1': {'good1': 3, 'good2': 4}, 'need2': {'good2': 2, 'good3': 2}}
NG2={'need1': {'good1': 13, 'good2': 23}, 'need2': {'good2': 8, 'good3': 14}}
(注意缺少
[]

根据您想要的具体内容,您可以省略
unstack

combined_df.plot.bar()
交付

编辑更新 我无法以这种方式准确地创建您需要的内容,您需要使用不同的字形和图形,而我没有技能或时间这样做,但我可以以正确的方式提供数据

combined_df = pd.concat({'ng1': pd.DataFrame(NG1), 'ng2': pd.DataFrame(NG2)}).stack()
combined_df.index.names = ['ng', 'good', 'need']
combined_df = combined_df.unstack(['good'])
combined_df['sum'] = combined_df.sum(axis=1)

添加到,您可以通过将总和绘制为单个条形图并使其未填充,在后台将总和绘制为另一个条形图

combined_df['sum'].plot.bar(zorder=0, fill=False)
完整解决方案:

import matplotlib.pyplot as plt
import pandas as pd

NG1={'need1': {'good1': 3, 'good2': 4}, 'need2': {'good2': 2, 'good3': 2}}
NG2={'need1': {'good1': 13, 'good2': 23}, 'need2': {'good2': 8, 'good3': 14}}

combined_df = pd.concat({'ng1': pd.DataFrame(NG1), 'ng2': pd.DataFrame(NG2)}).stack()
combined_df.index.names = ['ng', 'good', 'need']
combined_df = combined_df.unstack(['good'])

combined_df.plot.bar()

combined_df['sum'] = combined_df.sum(axis=1)
combined_df['sum'].plot.bar(zorder=0, fill=False)


plt.show()

期望的结果是什么?你希望这个图表是什么样子的?嗨!告诉我,使用matplotlib是否可以创建?谢谢您的回答!我用下图添加问题。告诉我这是否可以创建?以及如何在一张图片上绘制两张图纸:ng1(需要1,需要2)和ng2(需要1,需要2)。这可能吗?谢谢你的回答!!以及如何在一张图片上绘制两张图:ng1(need1,need2)和ng2(need1,need2)。这可能吗?
combined_df = pd.concat({'ng1': pd.DataFrame(NG1), 'ng2': pd.DataFrame(NG2)}).stack()
combined_df.index.names = ['ng', 'good', 'need']
combined_df = combined_df.unstack(['good'])
combined_df['sum'] = combined_df.sum(axis=1)
combined_df
    good    good1   good2   good3   sum
ng  need                
ng1     need1   3.0     4.0     NaN     7.0
need2   NaN     2.0     2.0     4.0
ng2     need1   13.0    23.0    NaN     36.0
need2   NaN     8.0     14.0    22.0
combined_df.plot.bar()
combined_df['sum'].plot.bar(zorder=0, fill=False)
import matplotlib.pyplot as plt
import pandas as pd

NG1={'need1': {'good1': 3, 'good2': 4}, 'need2': {'good2': 2, 'good3': 2}}
NG2={'need1': {'good1': 13, 'good2': 23}, 'need2': {'good2': 8, 'good3': 14}}

combined_df = pd.concat({'ng1': pd.DataFrame(NG1), 'ng2': pd.DataFrame(NG2)}).stack()
combined_df.index.names = ['ng', 'good', 'need']
combined_df = combined_df.unstack(['good'])

combined_df.plot.bar()

combined_df['sum'] = combined_df.sum(axis=1)
combined_df['sum'].plot.bar(zorder=0, fill=False)


plt.show()