如何使用Python-matplotlib绘制带有双y轴的图形并正确设置图例?

2026-04-13 08:151阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1995个文字,预计阅读时间需要8分钟。

如何使用Python-matplotlib绘制带有双y轴的图形并正确设置图例?

今天给大家介绍使用Python的matplotlib库绘制Y轴图像及其图例设置问题。希望对大家有所帮助,如有疑问或建议,可直接私信我。

效果预览:![matplotlib绘制Y轴图像及图例](https://example.com/matplotlib_y_axis_image.jpg)

示例数据:pythondf=pd.read_csv('jobdata.csv')


今天给大家介绍使用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)

如何使用Python-matplotlib绘制带有双y轴的图形并正确设置图例?

这样看就比较直观了,但是我就想把三个图例放一起不可以吗?当然可以!3. 设置组合图例

lines = lin0+lin1+lin2 labs = [label.get_label() for label in lines] plt.legend(lines,labs)


大功告成!

但是!如果是柱状图+折线图的情况,效果还一样吗?

但是!如果是柱状图+折线图的情况,效果还一样吗?

但是!如果是柱状图+折线图的情况,效果还一样吗?


2、双y轴柱状图+折线图

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+lin2 labs = [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)

效果:
其他参数大家可以自行尝试修改,对比前后效果,加深理解。

本文共计1995个文字,预计阅读时间需要8分钟。

如何使用Python-matplotlib绘制带有双y轴的图形并正确设置图例?

今天给大家介绍使用Python的matplotlib库绘制Y轴图像及其图例设置问题。希望对大家有所帮助,如有疑问或建议,可直接私信我。

效果预览:![matplotlib绘制Y轴图像及图例](https://example.com/matplotlib_y_axis_image.jpg)

示例数据:pythondf=pd.read_csv('jobdata.csv')


今天给大家介绍使用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)

如何使用Python-matplotlib绘制带有双y轴的图形并正确设置图例?

这样看就比较直观了,但是我就想把三个图例放一起不可以吗?当然可以!3. 设置组合图例

lines = lin0+lin1+lin2 labs = [label.get_label() for label in lines] plt.legend(lines,labs)


大功告成!

但是!如果是柱状图+折线图的情况,效果还一样吗?

但是!如果是柱状图+折线图的情况,效果还一样吗?

但是!如果是柱状图+折线图的情况,效果还一样吗?


2、双y轴柱状图+折线图

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+lin2 labs = [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)

效果:
其他参数大家可以自行尝试修改,对比前后效果,加深理解。