【问题标题】:Two graphs, two axis, one figure....stumped.两张图,两条轴,一张图……难住了。
【发布时间】:2015-09-07 18:57:48
【问题描述】:

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

假设我正在尝试绘制代表不同特征(以字母 A - G 为特征的贷款)的不同贷款条款('term')的值(“ROI”)的线。每个贷款期限的“发行日期”范围不同(例如,期限 = 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)

当前迭代的屏幕和文件输出使第一个图(term ==36)的大小比第二个小得多。我想通过定义 2 个具有相同无花果大小的单独数字,我可以摆脱这种情况?

提前感谢您的帮助!

【问题讨论】:

  • 当您调用plt.figure 时,它会创建一个新图形。更有可能的是,您想致电plt.subplot。第一个调用应该类似于plt.subplot(1, 2, 1),第二个调用应该类似于plt.subplot(1, 2, 2)(参数是:nrows、ncols、plot_number)。
  • @askewchan - 谢谢,我之前尝试过,结果更好,但绘图使用了相同的 X 轴。不知道如何解决这个问题。我发现 MATPLOTLIB 非常令人困惑。
  • 哈哈,是的,matplotlib 非常令人困惑,但它是我们在 python 中最好的(据我所知)。如果您可以制作一个不依赖于您的数据的示例(您可以使其随机),人们可以提供更多帮助。现在我不确定你所说的“相同的 X 轴”是什么意思。
  • @askewchan - 谢谢。 “相同的 X 轴”是指相互绘制的图,只有底部图有一个标记轴,用于拟合两个系列。我很难制作一个随机数据集,但是如果我告诉你 x 轴是一系列日期(格式为 MMYYYY),并且 term value = 36 的日期是从 2007 年到 2012 年,而日期为term value =60 是从 2010 年到 2012 年,这有帮助吗?新手很难快速发明一个说明这个问题的数据集!

标签: python matplotlib


【解决方案1】:

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

在您的情况下,您不想调用任何这些目录。相反,您应该致电plt.subplots()(注意末尾的“s”)。这是一个方便的函数,它将创建一个图形,在该图形中放置一个更多轴,然后返回图形和所有轴。然后,您可以将轴传递给 pandas plot 函数以强制它在该轴上绘图。您也可以为该轴调用设置legendtitle,但在 pandas 中执行此操作可能更容易。

所以这样的事情应该可以工作(我也简化了一些事情):

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()

【讨论】:

  • 感谢您的建议,但代码不起作用。我现在看到一张空白图(有轴但没有图)和第二张图重叠了两个图。我还注意到 ax.title 方法抛出了一个错误。最后,我收到警告:“/Applications/anaconda/lib/python2.7/site-packages/matplotlib/figure.py:387: UserWarning: matplotlib is current using a non-GUI backend, so cannot show the figure "matplotlib当前正在使用非 GUI 后端,"
  • 另外,我不知道你为什么用两个不同的 dfs (df2, df3) 来编码?我确定您在 groupby 命令中也缺少对 df2 的引用。我用的是我原来的线路,应该是一样的,n'est ce que pas?
  • 我想我想通了(部分):我错过了 df3.plot 调用中的“ax=ax”分配。 ax.title 行仍然出错 - 消息是:“'Text' 对象不可调用。”
  • 对不起,应该是set_title。固定。
  • 是的。作品。谢谢你。处理大量图表的任何风格建议?例如,假设我想分别绘制每个“等级”?例如,我会在显示器中放置小图(比如 9x9)并将较大的图保存到文件中。仍然没有 100% 确信如何 a) 使用轴,以及 b) 我如何创建循环和定义/调用不同的轴...
猜你喜欢
  • 1970-01-01
  • 2016-11-03
  • 2021-08-18
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2011-11-04
  • 2011-10-31
相关资源
最近更新 更多