Python-matplotlib | Draw dual y-axis graphics (legend settings)

Release: 2023-08-09 16:06:30
forward
2350 people have browsed it


Today I will introduce to you how to use Python’s matplotlib library to draw a double y-axis graph And the legend setting problem , I hope it will be helpful to everyone. If you have any questions or suggestions, you can send a private message to the editor.
Rendering preview:

Python-matplotlib | Draw dual y-axis graphics (legend settings)

Sample data:
##
df = pd.read_csv('jobdata.csv')
Copy after login
Python-matplotlib | Draw dual y-axis graphics (legend settings)

# 1. Double y-axis line chart

##1 . Position number line chart

##
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()
Copy after login
##2. Add a y-axis through ax1.twinx():

Python-matplotlib | Draw dual y-axis graphics (legend settings)

# 增加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()
Copy after login

重点:细心的小伙伴可能发现了图没有问题,但是右上角的图例只显示了平均最低薪资和平均最薪资,但是岗位数量的图例并没有显示。

3. 单独设置图例

ax1.legend(loc='best')
ax2.legend(loc='best')
Copy after login

Python-matplotlib | Draw dual y-axis graphics (legend settings)

看着感觉没什么变化,实际上仔细看会发现平均最低薪资、平均最高薪资、岗位数量三个图例都显示出来了,只不过岗位数量图例被盖住了,我们可以移动一下位置看看:
ax1.legend(loc=2)
ax2.legend(loc=1)
Copy after login

Python-matplotlib | Draw dual y-axis graphics (legend settings)

这样看就比较直观了,但是我就想把三个图例放一起不可以吗?

当然可以!

3. 设置组合图例

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

Python-matplotlib | Draw dual y-axis graphics (legend settings)


大功告成!

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

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

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


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)
Copy after login

直接报错了!Python-matplotlib | Draw dual y-axis graphics (legend settings)Python-matplotlib | Draw dual y-axis graphics (legend settings)Python-matplotlib | Draw dual y-axis graphics (legend settings)

Python-matplotlib | Draw dual y-axis graphics (legend settings)

The prompt type is inconsistent. It is obviously a problem with the type of bar and line. Let’s check the source code:

matplotlib.axes.Axes.plot:

Python-matplotlib | Draw dual y-axis graphics (legend settings)

matplotlib.axes.Axes.bar:

Python-matplotlib | Draw dual y-axis graphics (legend settings)

ax.plot returns a Line2D type list, ax.bar returns a patches Type tuple.
#After finding the root cause, we can just make a combination of line2D and 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)
Copy after login
效果:
Python-matplotlib | Draw dual y-axis graphics (legend settings)
其他参数大家可以自行尝试修改,对比前后效果,加深理解。

The above is the detailed content of Python-matplotlib | Draw dual y-axis graphics (legend settings). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:Python当打之年
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template