You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:08:13