解决ValueError: x与y需同第一维度的美债收益率绘图报错
解决Matplotlib绘制收益率图表时的维度不匹配错误
这个错误的原因很明确:你用来作为x轴的Date列表只有1个元素,但y轴的Yield有22个元素,Matplotlib绘制折线图要求x和y的数据长度必须完全一致,所以才会抛出ValueError: x and y must have same first dimension的异常。
为什么你的代码会出现这个问题?
看一下你写的循环:
for i in range(1,32): Date= ['05/'+str(i)+'/2018']
每次循环都会把Date重新赋值为只包含单个日期的列表,循环结束后Date只会保留最后一次循环的结果(也就是['05/31/2018']),长度为1,和Yield的22个数据点完全不匹配。
修复方案
你需要生成和Yield长度一致的日期列表(22个,对应5月1日到5月22日),这里提供几种简单的实现方式:
方式1:用列表推导式快速生成日期列表
import matplotlib.pyplot as plt # 生成5月1日到5月22日的日期列表,和Yield长度匹配 Date = [f'05/{day}/2018' for day in range(1, 23)] Yield = [1.68,1.69,1.68,1.67,1.69,1.69, 1.68,1.69,1.68,1.70,1.69,1.69,1.70, 1.68,1.71,1.73,1.76,1.74,1.70,1.77,1.77,1.76] plt.plot(Date, Yield) plt.xlabel('Date') plt.ylabel('Percentage') # 旋转x轴标签,避免日期重叠显示 plt.xticks(rotation=45) plt.show()
方式2:用循环正确追加日期到列表
如果更习惯用循环构建列表,要记得用append方法添加元素,而不是每次重新赋值:
import matplotlib.pyplot as plt Date = [] # 循环生成1到22号的日期,逐个添加到列表 for day in range(1, 23): Date.append(f'05/{day}/2018') Yield = [1.68,1.69,1.68,1.67,1.69,1.69, 1.68,1.69,1.68,1.70,1.69,1.69,1.70, 1.68,1.71,1.73,1.76,1.74,1.70,1.77,1.77,1.76] plt.plot(Date, Yield) plt.xlabel('Date') plt.ylabel('Percentage') plt.xticks(rotation=45) plt.show()
方式3:用Pandas处理日期(更专业的做法)
如果后续还要做更多时间序列分析,推荐用Pandas生成日期序列,这样日期格式更规范,后续处理也更方便:
import matplotlib.pyplot as plt import pandas as pd # 生成从2018-05-01开始的22个连续日期 dates = pd.date_range(start='2018-05-01', periods=22) Yield = [1.68,1.69,1.68,1.67,1.69,1.69, 1.68,1.69,1.68,1.70,1.69,1.69,1.70, 1.68,1.71,1.73,1.76,1.74,1.70,1.77,1.77,1.76] plt.plot(dates, Yield) plt.xlabel('Date') plt.ylabel('Percentage') plt.xticks(rotation=45) plt.show()
内容的提问来源于stack exchange,提问作者Ehab Elsaid
相关产品推荐
相关产品推荐

