我有2个DF描述2个具有2个共同点的对象。如何用一个共同的图例构建2个图表?
我尝试使用matplotlib子图,但我不了解图例的工作原理。
inport pandas as pd
描述Jup的第一个DF:
df1=pd.DataFrame({'Dates' : pd.date_range('2002-02-04',periods=3),
'fac1' : [1,1.02,0.98],
'fac2':[2,2.05,2.06]
})
描述山雀的2d DF
df2=pd.DataFrame({'Dates' : pd.date_range('2002-02-04',periods=3),
'fac1' : [1,0.95,1.10],
'fac2':[0.5,0.6,0.55]
})
我可以像这样分别绘制:
df1.plot(x=df1.iloc[:,0].name,
y=df1.iloc[:,1:3].columns,
legend=True,title='jup')
和这个:
df2.plot(x=df2.iloc[:,0].name,
y=df2.iloc[:,1:3].columns,
legend=True,title='tit')
但是,如何使用具有公共和单个图例的matplotlib样式子图来实现此功能?
答案 0 :(得分:0)
结帐this recipe from Matplotlib docs。关键是您需要首先使用subplots
创建图形和坐标轴,然后将图例而不是坐标轴实例添加到图形中:
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2, 1) # change layout to (1, 2) for side-by-side plots
l1 = ax1.plot(df1.set_index('Dates'))
l2 = ax2.plot(df2.set_index('Dates'))
fig.legend(l1, ['fac1', 'fac2']) # You only need to add one set of lines and labels
ax1.set_title('jup')
ax2.set_title('tit')
此外,您只需要将Dates
设置为数据帧的索引,pandas
和matplotlib
将很好地处理其余部分。
答案 1 :(得分:0)
这是一种替代方法。这个想法是创建两个轴对象,然后将它们传递以绘制两个DataFrame。然后将legend=False
用于第一个图,因为两个图的图例都相同。现在,您可以使用loc
在图形外部设置公共图例的位置。
完整的工作答案
import pandas as pd
import matplotlib.pyplot as plt
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(9, 3))
df1=pd.DataFrame({'Dates' : pd.date_range('2002-02-04',periods=3),
'fac1' : [1,1.02,0.98],'fac2':[2,2.05,2.06]})
df2=pd.DataFrame({'Dates' : pd.date_range('2002-02-04',periods=3),
'fac1' : [1,0.95,1.10], 'fac2':[0.5,0.6,0.55]})
df1.plot(x=df1.iloc[:,0].name, y=df1.iloc[:,1:3].columns, legend=False, title='jup', ax=ax[0])
df2.plot(x=df2.iloc[:,0].name, y=df2.iloc[:,1:3].columns, legend=True, title='tit', ax=ax[1])
ax[1].legend(loc=(1.1, 0.5))
plt.show()