第7节,绘制双y轴

matplotlib绘制双y轴的思路是共享x轴,使用add_subplot方法添加子图,绘制完第一个Axes后再复制一个并共享x轴

fig = plt.figure()
ax = fig.add_subplot()
# 绘制第一个axes

ax2 = ax.twinx()
# 绘制第二个axes

下面以两组气温数据为例子讲解如何绘制双y轴

1. 两组气温数据

import matplotlib
from matplotlib import pyplot as plt

matplotlib.rcParams['font.family'] = 'SimHei'

centigrade = [
    {'月份': 1, '日均最高气温': 2},
    {'月份': 2, '日均最高气温': 5},
    {'月份': 3, '日均最高气温': 12},
    {'月份': 4, '日均最高气温': 20},
    {'月份': 5, '日均最高气温': 26},
    {'月份': 6, '日均最高气温': 30},
    {'月份': 7, '日均最高气温': 31},
    {'月份': 8, '日均最高气温': 30},
    {'月份': 9, '日均最高气温': 26},
    {'月份': 10, '日均最高气温': 19},
    {'月份': 11, '日均最高气温': 10},
    {'月份': 12, '日均最高气温': 3}
]

fahrenheit = [{'月份': 1, '日均最高气温': 84.2},
              {'月份': 2, '日均最高气温': 84.2},
              {'月份': 3, '日均最高气温': 80.6},
              {'月份': 4, '日均最高气温': 73.4},
              {'月份': 5, '日均最高气温': 68.0},
              {'月份': 6, '日均最高气温': 62.6},
              {'月份': 7, '日均最高气温': 62.6},
              {'月份': 8, '日均最高气温': 64.4},
              {'月份': 9, '日均最高气温': 69.80},
              {'月份': 10, '日均最高气温': 73.4},
              {'月份': 11, '日均最高气温': 77.0},
              {'月份': 12, '日均最高气温': 80.6}
              ]


month = [str(item['月份']) for item in centigrade]
centigrade_lst = [item['日均最高气温'] for item in centigrade]
fahrenheit_lst = [item['日均最高气温'] for item in fahrenheit]

这两组气温数据分别是北温带和南太平洋上的一座城市的月平均最高气温,centigrade 用摄氏度做为单位,fahrenheit 用华氏温度。

2. 创建子图

为了实现双y轴,需要使用add_subplot方法添加一张子图

fig = plt.figure()
ax = fig.add_subplot()

3. 绘制第一个y轴的数据

ax.plot(month, centigrade_lst, label='摄氏温度', color='green', marker='o', linestyle='solid')
ax.set_ylabel("℃")
ax.set_ylim(0, 40)
ax.legend(loc='upper left')

legend方法如果没有传入标签名称,就会使用plot方法里的label参数所设置的值,loc参数是用来定位的,我让其位于左上角

4. 绘制第二个y轴的数据

ax2 = ax.twinx()
ax2.plot(month, fahrenheit_lst, label='华氏温度', color='blue', marker='s', linestyle='dashed')
ax2.set_ylabel("℉")
ax2.set_ylim(60, 100)
ax2.legend(loc='upper right')

twinx方法返回一个镜像Axes对象并共用x轴

5. 最后一击

plt.title('月平均气温')
ax.set_xlabel("月份")

plt.show()

这里要注意,为x轴设置说明标签,不要使用plt.xlabel('月份'),它是不起作用的。

最终呈现效果

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案