作者:夜的泪2502877077 | 来源:互联网 | 2023-08-20 21:02
我正在尝试从具有不同x和y范围的数据集中绘制2个单独的图.我对plt.figure,plt.subplot和plt.axes之间的交互感到困惑.假设我试图绘制代表不同贷款条件(“t
我正在尝试从具有不同x和y范围的数据集中绘制2个单独的图.我对plt.figure,plt.subplot和plt.axes之间的交互感到困惑.
假设我试图绘制代表不同贷款条件(“ term”)的不同特征(以字母A-G表示的贷款)的值(“ 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.subplot允许您在图形中创建多个轴.图形和轴都是对象,具有各自的方法.例如,plt.plot只是将对象对象的plot方法包装起来的东西.
在您的情况下,您不想调用这些目录中的任何一个.相反,您应该调用plt.subplots()(在末尾注意“ s”).此便利功能将创建一个图形,在该图形中放置多个轴,然后返回图形和所有轴.然后,您可以将轴传递给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()