如何使用matplotlib创建自定义Python图表

3

我希望使用Matplotlib(也可以使用其他库)制作一个高度定制化的图表。

我的数据看起来像这样

ItemID | ItemPhase | ItemStatus | ItemOutcome |  Date      
  1        Phase1     Complete       In         01-02-2011
  2        Phase2       WIP          WIP        01-03-2014
  3        Phase1     Complete       Out        05-02-2010
  4        Phase3       WIP          WIP        01-04-2015
  5        Phase2     Complete       In         01-05-2012
  6        Phase2       WIP          WIP        01-02-2013
  7        Phase3     Complete       In         01-06-2015
  8        Phase2     Complete       Out        01-07-2013

图表的目的是展示每个阶段已经完成的项目的进展情况。每次完成一个项目,就会确定一个结果;如果该项目尚未完成,则没有结果。
日期只有在获取项目阶段时才有用。基于日期,可以确定阶段。
我希望图表看起来像这样: enter image description here 从图片中可以看出,项目结果部分是由项目状态部分的结果组成的。
我一直很难开始或想到如何构建这个图表,所以非常感谢您的帮助。
感谢您的支持!

你尝试了什么?你可以玩弄条形图,小心地设置“bottom”参数以正确堆叠它们。 - filippo
1个回答

2
这里有一些指针可以帮助你入门。
假设你的数据框命名为df,你想绘制Phase2ItemStatus单元格的图表。
df = df[df['ItemPhase'] == 'Phase2']
total = df['ItemStatus'].count()

首先,您可以绘制带有项目计数的点状条形图。 如果每个状态单元格高度为1.0(要在完成和进行中百分比之间分配),我们可以为标签分配大约40%(height=1.4)。

ax.bar(0, 1.4, width=1, edgecolor='black', lw=1, ls='dotted', color="white")

现在让我们绘制主要部分,您需要第一个条形图从0ItemStatus == WIP的频率,第二个条形图从该频率开始并上升到一。您可以使用value_counts获取每个状态计数,并除以total以获得百分比。
bottom = 0
for i, s in enumerate(df['ItemStatus'].value_counts().iteritems()):
    label, count = s
    freq = count / float(total)

    r, = ax.bar(0, freq, width=1, bottom=bottom, color=bg[i], edgecolor='black', lw=3)

    ax.text(r.get_x() + r.get_width()/2.,
            r.get_y() + r.get_height()/2.,
            '{}% ({}) Items {}'.format(int(freq * 100), count, label),
            ha="center", va="center", color=fg[i])

    bottom += freq

现在您只需要一个“n Items”标签。您可以使用最新的条形图“r”坐标来正确居中它。
ax.text(r.get_x() + r.get_width()/2., 1.2,
        '{} Items'.format(total),
        ha="center", va='center', color='black')

这是您可以得到的内容:

enter image description here

现在你需要:
  • 找到一些漂亮的 pandas 的方法来遍历所有单元格
  • 使用日期信息作为 x 轴
  • 添加额外的标签,如 Phase xItem Status

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