>백엔드 개발 >파이썬 튜토리얼 >Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

Python当打之年
Python当打之年앞으로
2023-08-09 16:06:302419검색


오늘은 Python의 matplotlib 라이브러리를 사용하여 이중 y축 그래프를 그리는 방법과 범례 설정을 소개하겠습니다. 질문이나 제안이 있으면 편집자에게 비공개 메시지를 보낼 수 있습니다.
렌더링 미리보기:

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

샘플 데이터:
df = pd.read_csv('jobdata.csv')
Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

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

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

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

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

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

3. 单独设置图例

ax1.legend(loc='best')
ax2.legend(loc='best')

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

看着感觉没什么变化,实际上仔细看会发现平均最低薪资、平均最高薪资、岗位数量三个图例都显示出来了,只不过岗位数量图例被盖住了,我们可以移动一下位置看看:
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)

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)


大功告成!

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

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

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


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)

直接报错了!Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

프롬프트 유형이 일치하지 않습니다. 이는 막대 및 선 유형에 문제가 있는 것입니다. 소스 코드를 확인해 보겠습니다.

matplotlib.axes.Axes.plot:

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

matplotlib.axes. Axes.bar:

Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)

ax.plot은 Line2D 유형의 목록을 반환하고 ax.bar는 patches 유형의 튜플을 반환합니다.
근본 원인을 찾은 후에는 Line2D와 패치를 조합하여 만들면 됩니다.

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)
效果:
Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)
其他参数大家可以自行尝试修改,对比前后效果,加深理解。

위 내용은 Python-matplotlib | 이중 y축 그래픽 그리기(범례 설정)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Python当打之年에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제