【问题标题】:Create a graph (plot) on the data of the nested dictionary in matplotlib在 matplotlib 中嵌套字典的数据上创建图形(绘图)
【发布时间】:2017-11-28 20:29:29
【问题描述】:

我可以根据“简单”字典在 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}]}

如下图所示

【问题讨论】:

  • 期望的结果是什么?您希望图表是什么样的?
  • 嗨!告诉我,这是否可以创建,使用 matplotlib?

标签: python dictionary matplotlib


【解决方案1】:

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

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)}).unstack(0)
combined_df
   need1            need2
    ng1     ng2     ng1     ng2
good1   3.0     13.0    NaN     NaN
good2   4.0     23.0    2.0     8.0
good3   NaN     NaN     2.0     14.0

根据您想要的具体内容,您可以省略 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
    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()

【讨论】:

  • 感谢您的回答!我用下图添加问题。告诉我这是否可以创建?
  • 以及如何在一张图片上制作两张图纸:ng1(need1,need2)和ng2(need1,need2)。这可能吗?
【解决方案2】:

添加到@MaartenFabré 's solution,您可以通过将总和绘制为单独的条形图并使其未填充,从而在后台将总和作为另一个条形图,

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()

【讨论】:

  • 以及如何在一张图片上制作两张图纸:ng1(need1,need2)和ng2(need1,need2)。这可能吗?
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 2019-11-23
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2021-11-16
  • 2022-01-13
相关资源
最近更新 更多