Matplotlib 双Y轴显示时把图例显示到一起

前面学习过怎么样在同一个坐标系里显示双Y轴的数据,可以完善地解决了不同的曲线数据按不同的Y轴来绘制,这样尽可能地占用显示区域,看起来比较美观的问题,解决有于数据差距太大,导致一些数据曲线压缩的问题。但是在解决这个问题时,还留下了一个小问题并没有解决,看下图:

Matplotlib双Y轴显示时把图例显示到一起

从这里可以看到,图例分成两个显示,如果想合并到一起,要怎么办呢?其实要解决这个问题,并不太好处理,因为两个数据分两个坐标轴显示的,每次调用plt.legend都只会显示那个Y轴坐标轴的图例,并不能同时显示两个图例。难道就这样算了,不作处理了吗?显然是不行的,因此需要深入地分析一下这个问题。由于图例是自动把同一个Y轴里的标记显示,那么能否这样来思考一下,也就是说在某一个Y坐标轴里多画几个点,然后再把这几个标记收集起来,一起显示就解决了问题。

为了解决上面的问题,引入叫做子图的概念,它是调用函数plt.subplots()来实现。所谓的子图就是在一个画布上同时放置多个坐标系,每个坐标系独立地绘图,这样每个图是相互独立的X轴和Y轴。

在这里也采用这个函数plt.subplots()来创建一个子图,然后在上面显示温度与时间曲线,接着调用函数plt.twinx()来创建另外一个Y轴,再在上面显示压力与时间曲线。这时候设置X轴的标记,要使用下面的代码:

ax1.set_xlabel('Time')

这里使用了ax1对象,它是通过fig, ax1 = plt.subplots()这行代码创建的,代表子图的当前的坐标系。

ax1.set_ylim([0, 100])

使用这行代码来设置Y轴的刻度范围,大小为0到100。

ax1.set_ylabel('Temperatur', color = 'b')

使用这行代码来设置Y轴的标记,并且设置颜色为蓝色。

ax1.tick_params(axis='y', labelcolor = 'b')

使用这行代码来设置Y轴上刻度数字的颜色为蓝色

到这里就把左边的Y轴设置完成,同时绘好数据,接着下来就是创建右边的Y轴相关代码,它使用的函数跟左边是一样的。

最后关键的代码,就是重新绘了两个点的图例:

line1, = plt.plot([1], label = 'Temperature', color = 'b')

line2, = plt.plot([1], label = 'Pressure', color = 'r')

plt.legend(handles = [line1, line2], loc = 'upper left')

因为这里调用plt.plot两次,相当于绘了两条曲线,然后再使用plt.legend函数把这两个临时绘制的图例收集起来,就可以一次性地显示了。handles = [line1, line2]参数就是把曲线1和曲线2的示例一次性地显示出来。

整个代码显示的结果如下:

Matplotlib双Y轴显示时把图例显示到一起

例子的代码如下:

import numpy as np
import matplotlib.pyplot as plt


#定义显示的数据
x = [20, 40, 60, 80, 100, 120, 140]
T = [30, 50, 30, 46, 70, 43, 80]
P = [1.0, 2.0, 4.0, 6.0, 6.0, 5.5, 7.0]

plt.figure('deepinout.com 极客笔记')
fig, ax1 = plt.subplots()  #创建子图
ax1.grid(True)

#显示温度与时间曲线
l1 = ax1.plot(x, T, 'b', label = 'Temperature')

ax1.set_xlabel('Time')
ax1.set_ylim([0, 100])
ax1.set_ylabel('Temperatur', color = 'b')
ax1.tick_params(axis='y', labelcolor = 'b')

#显示压力与时间曲线
ax2 = plt.twinx()
l2 = ax2.plot(x, P, 'r', label = 'Pressure')

ax2.set_ylabel('Pressure', color = 'r')
ax2.set_ylim([0, 10])
ax2.tick_params(axis = 'y', labelcolor = 'r')

#图例
line1, = plt.plot([1], label = 'Temperature', color = 'b')
line2, = plt.plot([1], label = 'Pressure', color = 'r')
plt.legend(handles = [line1, line2], loc = 'upper left')

plt.show()

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程