2个图共享一个共同的图例

时间:2019-05-11 18:54:52

标签: pandas matplotlib

我有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样式子图来实现此功能?

2 个答案:

答案 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设置为数据帧的索引,pandasmatplotlib将很好地处理其余部分。

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

enter image description here