两个图,两个轴,一个图....难倒。

时间:2015-09-07 18:57:49

标签: python matplotlib

我试图从具有不同x和y范围的数据集中绘制2个单独的图。我对plt.figure,plt.subplot和plt.axes之间的交互感到困惑。

假设我试图为不同的贷款条款(' term')绘制代表价值(" ROI")的线,用于不同的特征(以字母A-G为特征的贷款)。 )。发行日期范围'每个贷款期限不同(例如,对于期限= 36,贷款自2007年起发起,期限= 60,贷款仅自2011年起发起)。

这里有一些我所拥有的伪代码。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from itertools import groupby

alpha_grades = ('A','B','C','D','E','F','G')

color_scheme = {'A':'b','B':'g','C':'r','D':'c','E':'m','F':'y','G':'k'}

for term in [36,60]:
    for grade in alpha_grades:
        if ( term == 36 ):
            plt.figure(1,figsize=(12,9))
        else:
            plt.figure(2,figsize=(12,9))

    df[(df['grade'] == grade) & (df['term']==term)].groupby(
        'issue_date')['ROI'].mean().plot(color=color_scheme[grade],label = ("Grade: %s" % grade))
    plt.legend(loc=2)
    title = ("%i Mo Lending Rate by Rating" % term)
    plt.title(title)

此当前迭代的屏幕和文件输出将第一个图形(术语== 36)的大小设置为远小于第二个图形。我想通过定义2个具有相同图形尺寸的独立图形,我可以远离它?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

图形基本上是一个窗口。该窗口可以有一个或多个轴,其中每个轴都是一个图。 plt.subplot允许您在图中创建多个轴。图形和轴都是对象,具有自己的方法。例如,plt.plot只是axes对象的plot方法的包装。

在您的情况下,您不想调用任何这些目录。相反,你应该拨打plt.subplots()(注意最后的“s”)。这是一个方便的功能,它将创建一个图形,在该图中放置一个更多的轴,然后返回图形和所有轴。然后,您可以将轴传递给pandas plot函数,以强制它在该轴上绘图。您也可以为该轴调用legendtitle,但在熊猫中更容易做到这一点。

所以这样的事情应该有效(我简化了一些事情):

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from itertools import groupby

alpha_grades = ('A','B','C','D','E','F','G')

color_scheme = {'A':'b','B':'g','C':'r','D':'c','E':'m','F':'y','G':'k'}

fig1, ax1 = plt.subplots(figsize=(12,9)) # same as plt.subplots(1, 1)
fig2, ax2 = plt.subplots(figsize=(12,9))

for term, ax in zip([36,60], [ax1, ax2]):
    ax.hold(True)
    for grade, color in color_scheme.items():
        df2 = df[(df['grade'] == grade) & (df['term']==term)]
        df3 = groupby('issue_date')['ROI'].mean()
        df3.plot(ax=ax, color=color, 
                 label=("Grade: %s" % grade))
    ax.hold(False)
    ax.legend(loc=2)
    ax.set_title("%i Mo Lending Rate by Rating" % term)

fig1.show()
fig2.show()

请注意,您不是使用plt,而是直接与图形和轴进行交互。

如果你想把两个图都放在一个图中,比如左边一个,右边一个,你可以这样做:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from itertools import groupby

alpha_grades = ('A','B','C','D','E','F','G')

color_scheme = {'A':'b','B':'g','C':'r','D':'c','E':'m','F':'y','G':'k'}

fig, axs = plt.subplots(1, 2, figsize=(12*2,9))  # creates two axes

for term, ax in zip([36,60], axs):
    ax.hold(True)
    for grade, color in color_scheme.items():
        df2 = df[(df['grade'] == grade) & (df['term']==term)]
        df3 = groupby('issue_date')['ROI'].mean()
        df3.plot(ax=ax, color=color, 
                 label=("Grade: %s" % grade))
    ax.hold(False)
    ax.legend(loc=2)
    ax.set_title("%i Mo Lending Rate by Rating" % term)

fig.show()