Matplotlib绘制矩阵横轴未从100起始,求原因及解决方法
问题:Matplotlib绘图横轴起始值不符合预期
尝试绘制首列值为100的矩阵,期望绘图横轴起始值为100,但实际从0开始。以下是使用的代码:
import numpy as np import matplotlib.pyplot as plt %matplotlib inline def ABM(n,m,S0,mu,sigma,dt): np.random.seed(999) arr = np.zeros((n, m)) arr[:,0] = S0 #initialize column 0 # fill in array entries for i in range(n): for j in range(1, m): dW = np.random.normal(0, np.sqrt(dt)) arr[i,j] = arr[i, j-1] + mu * dt + sigma * dW return arr paths_1 = ABM(n=1000,m=20,S0=100,mu=0,sigma=0.001,dt=1) print(paths_1) plt.figure(figsize=(14, 7)) for i in range(n): plt.plot(paths_1[i]) plt.title('Simulated Arithmetic Brownian Motion Paths') plt.xlabel('Time Steps') plt.ylabel('Stock Price') plt.grid(True) plt.show()
输出图表:

问题原因
- 直接传入一维数组给
plt.plot()时,Matplotlib默认会用数组的索引值作为横轴坐标,也就是从0开始的整数序列,和数组本身的数值无关。你的paths_1[i]是长度为20的一维数组,首元素是100,但绘图时横轴用的是0到19的索引,所以横轴从0开始。 - 额外注意:原代码中
for i in range(n)的n是函数ABM的局部参数,全局作用域未定义,运行时会触发变量未定义错误。
修复方法
方法一:自定义横轴数据
构造从100开始的横轴序列,和纵轴数据一一对应传入plot:
plt.figure(figsize=(14, 7)) # 生成从100开始的横轴数组,长度和单条路径一致 x_axis = np.arange(100, 100 + paths_1.shape[1]) # 遍历所有路径绘图 for i in range(paths_1.shape[0]): plt.plot(x_axis, paths_1[i]) plt.title('Simulated Arithmetic Brownian Motion Paths') plt.xlabel('Time Steps') plt.ylabel('Stock Price') plt.grid(True) plt.show()
方法二:修改横轴刻度标签
仅调整显示的刻度文字,不改变绘图的坐标映射:
plt.figure(figsize=(14, 7)) for i in range(paths_1.shape[0]): plt.plot(paths_1[i]) # 将原0-19的刻度替换为100-119 plt.xticks( ticks=np.arange(paths_1.shape[1]), labels=np.arange(100, 100 + paths_1.shape[1]) ) plt.title('Simulated Arithmetic Brownian Motion Paths') plt.xlabel('Time Steps') plt.ylabel('Stock Price') plt.grid(True) plt.show()
内容的提问来源于stack exchange,提问作者Yuxiang Zhang
相关产品推荐
相关产品推荐

