用python和matplotlib画双坐标系曲线

本文介绍了一种使用Matplotlib和NumPy在Python中绘制带有双Y轴的曲线图的方法,并展示了如何通过设置不同的颜色和标签来区分两条曲线,适用于展示对比实验结果。

 有时候写论文的时候不免会遇到画曲线图,而且还有可能需要画双坐标系(双Y轴)的曲线图,在百度中找了许久,先mark一下,以下代码就是我论文中用到的,以后应该还会用到,先保存在这里。结果图如下:

import matplotlib.pyplot as plt
import numpy as np
import scipy.io as sio

x = np.arange(0., 1000, 2, dtype=np.int32)
xx = np.arange(0., 2000, 4, dtype=np.int32)
data = sio.loadmat('C://Users//gmt//Desktop//bn.mat')
y1 = data["loss"][:1000, 0]
y2 = data["testacc"][:1000, 0]
data = sio.loadmat('C://Users//gmt//Desktop//wobn.mat')
y11 = data["loss"][:1000, 0]
y22 = data["testacc"][:1000, 0]

fig = plt.figure()

ax1 = fig.add_subplot(111)
ax1.plot(xx, y1[x], color='red', label='Loss with BN')
ax1.plot(xx, y11[x], color='green', label='Loss without BN')
ax1.set_ylabel('Cross Entropy Loss')
ax1.set_xlabel('Iterations')
ax1.set_ylim(0, 1500)
ax1.set_xlim(0, 1000)
plt.legend(loc='lower left')


ax2 = ax1.twinx()
ax2.plot(xx, y2[x], color='blue', label='Test Accuracy with BN')
ax2.plot(xx, y22[x], color='skyblue', label='Test Accuracy without BN')
ax2.set_ylabel('Testset Accuracy')
ax2.set_xlabel('Iterations')
ax2.set_ylim(0, 1)
ax2.set_xlim(0, 1000)
plt.legend(loc='upper right')
plt.show()

 

使用Pythonmatplotlib曲线,有以下几种常见情形方法: ### 一条简单的线 使用`plt.plot()`函数可以绘制简单的线,其基本语法为`plt.plot(x, y, "格式控制字符串")`。这里`x``y`分别是曲线在x轴y轴上的数据点,格式控制字符串用于指定曲线的颜色、线型等样式。例如: ```python import matplotlib.pyplot as plt # 示例数据 x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] # 绘制曲线 plt.plot(x, y) # 显示图形 plt.show() ``` ### 函数曲线 函数曲线时,可结合Python的`math`库常用函数以及`np.arange()`函数来生成数据点。`np.arange()`函数用于生成一系列连续的数值作为x轴的数据,再根据函数计算对应的y轴数据。示例如下: ```python import matplotlib.pyplot as plt import numpy as np # 生成x轴数据 x = np.arange(-10, 10, 0.1) # 定义函数 y = x^2 y = x ** 2 # 绘制曲线 plt.plot(x, y) # 显示图形 plt.show() ``` ### 同一张图同一坐标系多个曲线 在同一张图的同一坐标系绘制多个曲线,只需多次调用`plt.plot()`函数即可。示例如下: ```python import matplotlib.pyplot as plt import numpy as np # 生成x轴数据 x = np.arange(-10, 10, 0.1) # 定义第一个函数 y = x^2 y1 = x ** 2 # 定义第二个函数 y = x^3 y2 = x ** 3 # 绘制第一条曲线 plt.plot(x, y1, label='y = x^2') # 绘制第二条曲线 plt.plot(x, y2, label='y = x^3') # 添加图例 plt.legend() # 显示图形 plt.show() ``` ### 同一张图不同坐标系多个曲线 可以使用`plt.subplot()`函数来创建不同的坐标系,在不同的坐标系绘制曲线。示例如下: ```python import matplotlib.pyplot as plt import numpy as np # 生成x轴数据 x = np.arange(-10, 10, 0.1) # 定义第一个函数 y = x^2 y1 = x ** 2 # 定义第二个函数 y = x^3 y2 = x ** 3 # 创建第一个子图 plt.subplot(2, 1, 1) plt.plot(x, y1) plt.title('y = x^2') # 创建第二个子图 plt.subplot(2, 1, 2) plt.plot(x, y2) plt.title('y = x^3') # 显示图形 plt.show() ``` ### 同时多张图 使用`plt.figure()`函数可以创建多个不同的图形窗口,在不同的窗口中绘制曲线。示例如下: ```python import matplotlib.pyplot as plt import numpy as np # 生成x轴数据 x = np.arange(-10, 10, 0.1) # 定义第一个函数 y = x^2 y1 = x ** 2 # 定义第二个函数 y = x^3 y2 = x ** 3 # 创建第一个图形窗口 plt.figure(1) plt.plot(x, y1) plt.title('y = x^2') # 创建第二个图形窗口 plt.figure(2) plt.plot(x, y2) plt.title('y = x^3') # 显示图形 plt.show() ``` ### 动态曲线 通过不断更新数据重绘图形,可以实现动态曲线绘制。示例代码如下: ```python import matplotlib.pyplot as plt from random import random fig, ax = plt.subplots() x = [] y = [] res = 0 for i in range(50): x.append(i) y.append(50 * random()) ax.cla() # 清除当前图形 ax.plot(x, y, 'r', lw=1) # 绘制曲线 plt.pause(0.1) # 暂停一段时间,以便观察动态效果 plt.show() ``` ### 设置坐标轴刻度标签 可以使用`plt.xticks()``plt.yticks()`函数来设置坐标轴的刻度标签。例如: ```python import matplotlib.pyplot as plt import numpy as np x = np.arange(-2 * np.pi, 2 * np.pi, 0.1) y = np.sin(x) plt.plot(x, y) plt.xticks([-np.pi * 2, -np.pi * 3 / 2, -np.pi, -np.pi / 2, 0, np.pi / 2, np.pi, np.pi * 3 / 2, np.pi * 2], [r'$-2\pi$', r'$-\frac{3}{2} \pi$', r'$-\pi$', r'$-\frac{1}{2}\pi$', r'0', r'$\frac{1}{2}\pi$', r'$\pi$', r'$\frac{3}{2}\pi$', r'$2 \pi$']) plt.show() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值