使用matplotlib创建多个图的智能方法

时间:2018-09-05 20:11:48

标签: python pandas matplotlib

我有一个excel工作表,可以说它的名字是'ws_actual'。数据如下。

Project Name    Date Paid   Actuals Item Amount Cumulative Sum
A   2016-04-10 00:00:00 124.2   124.2
A   2016-04-27 00:00:00 2727.5  2851.7
A   2016-05-11 00:00:00 2123.58 4975.28
A   2016-05-24 00:00:00 2500    7475.28
A   2016-07-07 00:00:00 38374.6 45849.88
A   2016-08-12 00:00:00 2988.14 48838.02
A   2016-09-02 00:00:00 23068   71906.02
A   2016-10-31 00:00:00 570.78  72476.8
A   2016-11-09 00:00:00 10885.75    83362.55
A   2016-12-08 00:00:00 28302.95    111665.5
A   2017-01-19 00:00:00 4354.3  116019.8
A   2017-02-28 00:00:00 3469.77 119489.57
A   2017-03-29 00:00:00 267.75  119757.32
B   2015-04-27 00:00:00 2969.93 2969.93
B   2015-06-02 00:00:00 118.8   3088.73
B   2015-06-18 00:00:00 2640    5728.73
B   2015-06-26 00:00:00 105.6   5834.33
B   2015-09-03 00:00:00 11879.7 17714.03
B   2015-10-22 00:00:00 5303.44 23017.47
B   2015-11-08 00:00:00 52000   75017.47
B   2015-11-25 00:00:00 2704.13 77721.6
B   2016-03-09 00:00:00 59752.85    137474.45
B   2016-03-13 00:00:00 512.73  137987.18
.
.
.

让我们说还有更多的项目,包括带有已付日期和金额信息的A和B。我想按项目创建一个绘图,其中x轴为“已付款日期”,y轴为“累计总和”,但是当我仅实现以下代码时,它只是组合了每个项目并在一张图中绘制了每个“累计总和” 。我想知道是否需要按项目划分表,保存每个表,然后一个接一个地绘制图形。这是很多工作,所以我想知道是否有更明智的方法。天才,请帮助我。

import pandas as pd
import matplotlib.pyplot as plt

ws_actual = pd.read_excel(actual_file[0], sheet_name=0)
ax = ws_actual.plot(x='Date Paid', y='Cumulative Sum', color='g')

2 个答案:

答案 0 :(得分:2)

您可以仅迭代项目:

for proj in ws_actual['Project'].unique():
    ws_actual[ws_actual['Project'] == proj].plot(x='Date Paid', y='Cumulative Sum', color='g')
    plt.show()

或者查看seaborn来制作facet grid的简单方法,您可以为此设置行变量。类似于:

import seaborn as sns

g = sns.FacetGrid(ws_actual, row="Project")
g = g.map(plt.scatter, "Date Paid", "Cumulative Sum", edgecolor="w")

答案 1 :(得分:2)

现在,无论组如何,您都将连接所有点。一个简单的循环将在这里起作用,允许您对DataFrame进行分组,然后将每组绘制为单独的曲线。如果您有很多组,则可以定义自己的颜色周期,这样颜色就不会重复。

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8,8))
for id, gp in ws_actual.groupby('Project Name'):
    gp.plot(x='Date Paid', y='Cumulative Sum', ax=ax, label=id)

plt.show()

enter image description here