如何在matplotlib中按不同组绘制直方图?

Zel*_*ong 5 python plot matplotlib histogram pandas

我有一张像:

value    type
10       0
12       1
13       1
14       2
Run Code Online (Sandbox Code Playgroud)

生成虚拟数据:

import numpy as np

value = np.random.randint(1, 20, 10)
type = np.random.choice([0, 1, 2], 10)
Run Code Online (Sandbox Code Playgroud)

我想用 matplotlib (v1.4) 在 Python 3 中完成一项任务:

  • 绘制直方图 value
  • group by type,即使用不同的颜色来区分类型
  • “酒吧”的位置应该是“躲避”,即并排
  • 由于值的范围很小,我将identity用于垃圾箱,即垃圾箱的宽度为 1

问题是:

  • 如何根据type颜色图(例如Accent或 matplotlib 中的其他 cmap)的值和绘制颜色为条形分配颜色?我不想使用命名颜色(即'b', 'k', 'r'
  • 我的直方图中的条形相互重叠,如何“躲避”条形?

笔记

  1. 我已经尝试了 Seaborn、matplotlib 和pandas.plot两个小时,但未能获得所需的直方图。
  2. 我阅读了 matplotlib 的示例和用户指南。令人惊讶的是,我没有找到关于如何从颜色图中分配颜色的教程。
  3. 我在谷歌上搜索过,但没有找到一个简洁的例子。
  4. 我想人们可以使用 完成任务matplotlib.pyplot,而无需导入一堆模块,例如matplotlib.cm, matplotlib.colors

max*_*moo 7

对于您的第一个问题,我们可以创建一个等于 1 的虚拟列,然后通过对按值和类型分组的此列求和来生成计数。

对于您的第二个问题,您可以plot使用colormap参数将颜色图直接传递给:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import seaborn
seaborn.set() #make the plots look pretty

df = pd.DataFrame({'value': value, 'type': type})
df['dummy'] = 1
ag = df.groupby(['value','type']).sum().unstack()
ag.columns = ag.columns.droplevel()

ag.plot(kind = 'bar', colormap = cm.Accent, width = 1)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明