如何绘制条形图以使用Python中的Pandas将多个系统与多个变量进行比较

时间:2016-11-24 22:02:56

标签: python pandas matplotlib data-visualization data-analysis

我正在与Pandas进行一些基本的数据分析,并且在绘制数据方面遇到了麻烦。我有多个系统的数据,每个系统都有排名位置(1-10)。在每个等级位置中,有A,C和F等级,具有百分比。我希望每个系统都有一个图表,其中x轴包含等级,y轴包含等级百分比。以下是我的数据示例:

{
  "System1": {
      "1": {
             "A": 0.5,
             "C": 0.3,
             "F": 0.1
           },
      "2": {
             "A": 0.3,
             "C": 0.3,
             "F": 0.4
           },
      ...,
      "10": {
              "A": 0.1,
              "C": 0.3,
              "F": 0.6
            }
   },
   "System2": {
       "1": {
              ...
            },
       ...,
       "10": {
              ...
        }
   }
}

我想生成一个如下图: enter image description here

我已使用pd.DataFrame.from_dict(ranked_grades)将数据加载到数据框中,但我无法让Pandas使用我的数据的嵌套结构。我的数据框在加载后看起来像这样:

                                              System1                                           System2                                
1   {'C': 0.35377358490566035, 'F': 0.132075471698...  {'C': 0.3696682464454976, 'F': 0.1611374407582...  
2   {'C': 0.33490566037735847, 'F': 0.372641509433...  {'C': 0.3459715639810427, 'F': 0.2890995260663...  
3   {'C': 0.330188679245283, 'F': 0.41037735849056...  {'C': 0.3080568720379147, 'F': 0.4502369668246...  
4   {'C': 0.2783018867924528, 'F': 0.5235849056603...  {'C': 0.3175355450236967, 'F': 0.4739336492890... 
...
10  {'C': 0.2830188679245283, 'F': 0.5943396226415...  {'C': 0.24170616113744076, 'F': 0.630331753554... 

2 个答案:

答案 0 :(得分:2)

我在这里学到了很多东西。如果我找到更多,我可以更新这个答案。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

d = {
    k0: {
        k1: {
            k2: np.random.randint(0, 10) / 10 for k2 in list('ACF')
        } for k1 in range(1, 11)
    } for k0 in ['System1', 'System2']
}

df = pd.Panel(d).to_frame().rename_axis([None, None]).T.stack()
fig, axes = plt.subplots(2, 1, figsize=(6, 4), sharex=True)
for i, (name, group) in enumerate(df.groupby(level=0)):
    group.xs(name).sort_index().plot.bar(ax=axes[i], ylim=[0, 1])
    axes[i].set_title(name, rotation=270, position=(1.05, .55),
                      backgroundcolor='gray')

axes[0].legend(bbox_to_anchor=(1.1, .2), loc=2, borderaxespad=0.)
axes[1].legend().remove()

plt.subplots_adjust(hspace=0.1)

enter image description here

答案 1 :(得分:1)

from_dict方法不期望嵌套的dicts。所以你需要循环并以这种方式读取数据。

dfs = []
for key in sorted(ranked_grades):
    dfs.append(pd.DataFrame.from_dict(ranked_grades[key]))

然后,将它们连接在一起

data = pd.concat(dfs, keys=sorted(ranked_grades))

现在你应该有一个可以使用的数据结构。