Python-matplotlib | 绘制双y轴图形(图例设置)
df = pd.read_csv('jobdata.csv')
1、双y轴折线图
1. 岗位数量折线图
colors = ["#51C1C8", "#536D84","#E96279"]plt.figure(figsize=(16, 8))ax1 = plt.subplot(111)ax1.set_ylim(0,1200)lin0 = ax1.plot(x_data, y_data1, marker='o', color=colors[0], label='岗位数量') for x, y in enumerate(y_data1): plt.text(x - 0.2, y+5, y)ax1.set_ylabel('岗位数量',fontsize=12)plt.legend()plt.title("各城市Java岗位数量")plt.show()
2. 通过 ax1.twinx() 增加一个y轴:
# 增加y轴ax2 = ax1.twinx()ax2.set_ylim(0,60)lin1 = ax2.plot(x_data, y_data2, linestyle='--', marker='o', c=colors[1], label='平均最低薪资') for x, y in enumerate(y_data2): plt.text(x - 0.1, y+1, y)lin2 = ax2.plot(x_data, y_data3, linestyle='--', marker='o', c=colors[2], label='平均最高薪资')for x, y in enumerate(y_data3): plt.text(x - 0.1, y+1, y)ax2.set_ylabel('平均薪资(万/年)',fontsize=12)plt.legend()plt.title("各城市Java岗位数量和薪资水平状况")plt.show()
3. 单独设置图例
ax1.legend(loc='best')ax2.legend(loc='best')
ax1.legend(loc=2)ax2.legend(loc=1)
这样看就比较直观了,但是我就想把三个图例放一起不可以吗?
当然可以!
3. 设置组合图例
lines = lin0+lin1+lin2labs = [label.get_label() for label in lines]plt.legend(lines,labs)
大功告成!
但是!如果是柱状图+折线图的情况,效果还一样吗?
但是!如果是柱状图+折线图的情况,效果还一样吗?
但是!如果是柱状图+折线图的情况,效果还一样吗?
1. 修改岗位数量为柱状图
plt.figure(figsize=(16, 8))a1 = plt.subplot(111)a1.set_ylim(0,1200)bar = a1.bar(x_data, y_data1, color=colors[0], label='岗位数量') for x, y in enumerate(y_data1): plt.text(x - 0.2, y+5, y)a1.set_ylabel('岗位数量',fontsize=12)...lines = bar+lin1+lin2labs = [label.get_label() for label in lines]plt.legend(lines,labs)
直接报错了!
提示类型不一致,显然是bar和line的类型问题,我们查一下源码:
matplotlib.axes.Axes.plot:
matplotlib.axes.Axes.bar:
ax.plot返回的是一个Line2D类型的列表,ax.bar返回的是一个patches类型的元组。找到根本原因后,我们做一个line2D和patches的组合就可以了。2. 设置Line2D和patches的组合图例
legend_handles = [ Line2D([], [], linewidth=1, ls='--', lw=2, c=colors[2], label='平均最高薪资'), Line2D([], [], linewidth=1, lw=2, c=colors[1], label='平均最低薪资'), patches.Rectangle((0, 0), 1, 1, facecolor=colors[0],label='岗位数量')]plt.legend(handles=legend_handles, loc='best', fontsize=14)