Matplotlib:如何在2个独立的轴上显示条形图和线条的图例?

时间:2018-01-28 08:53:44

标签: python matplotlib legend multiple-axes

我正在绘制左轴上的条形图和右轴上的折线图。 如何在同一个图例框中显示两者的图例?

使用下面的代码,我得到两个单独的图例框;另外,我需要手动指定第二个图例的位置,有大量的反复试验,否则它会与第一个图例重叠。

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

df=pd.DataFrame()
df["bar"]=[40,35,50,45]
df["line"]=[.5,.3,.2,.6]

fig,ax=plt.subplots(2)

l1 = ax[0].bar(df.index, df["bar"], label='my bar chart (left axis)', color='royalblue', width = 0.55)
ax0b=ax[0].twinx()
l2 = ax0b.plot(df.index,  df['line'], label='my line (right axis)',color='tomato',marker='.', ls='dashed')

ax[0].legend(loc='upper left', fancybox=True, title='My title')
ax0b.legend(bbox_to_anchor=(0.155,0.8), loc=1)    
plt.show()

如果我在两个不同的轴上有两条线,而不是条形图和折线图,我会这样做:

myl=l1+l2
labs=[l.get_label() for l in myl]
ax[0].legend(myl, labs, loc='upper left')

但这在我的案例中并不起作用。我明白了:

myl=l1+l2
TypeError: can only concatenate tuple (not "list") to tuple

我认为必须是因为bar()和plot()返回两个不能连接的不同对象。

思考/建议?谢谢!

1 个答案:

答案 0 :(得分:1)

python错误的好处在于它们通常可以按字面意思直接告诉你问题。

"类型错误"告诉你,你有类型的问题。您可以打印类型:

print(type(l1)) # <class 'matplotlib.container.BarContainer'>
print(type(l2)) # <type 'list'>

现在,&#34;只能将元组(不是&#34; list&#34;)连接到元组&#34;告诉您无法将barcontainer添加到列表中。

简易解决方案:添加两个列表:

myl=[l1]+l2