Matplotlib绘制动画散点图报错vertices需为Nx2二维数组如何解决
问题原因分析
- 未手动设置坐标轴范围:极坐标转换后x、y的取值范围在[-15000, 15000]之间,而matplotlib默认坐标轴范围是[0, 1],所有散点都渲染到了画布可视区域外,因此显示空白。
- 空偏移量兼容问题:
init函数返回的空偏移量在部分旧版本matplotlib中不被支持,同时FuncAnimation没有指定帧数量,会出现i超过x数组长度的异常场景,触发参数校验报错。 - 画布资源提前释放:
plt.show()执行后会释放figure资源,后续调用save方法操作已销毁的画布,也会触发异常。 - 缺省写入器配置问题:保存GIF时未指定写入器,部分环境会因为缺省配置报错。
修复后完整代码
import sympy import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as ani def convert_to_polar_coordinates(num): return num * np.cos(num), num * np.sin(num) fig = plt.figure(figsize=(8, 8)) # 手动匹配坐标范围,确保散点在可视区域内 plt.xlim(-15000, 15000) plt.ylim(-15000, 15000) primes = sympy.primerange(0, 15000) primes = np.array(list(primes)) x, y = convert_to_polar_coordinates(primes) scat = plt.scatter([],[],s=1) def init(): # 初始帧返回第一个点,避免空数组触发校验错误 init_data = np.hstack((x[:1,np.newaxis], y[:1, np.newaxis])) scat.set_offsets(init_data) return scat, def plot_in_polar(i): data = np.hstack((x[:i+1,np.newaxis], y[:i+1, np.newaxis])) scat.set_offsets(data) return scat, plt.axis("off") # 明确指定帧数量为素数总个数,避免数组越界 animator = ani.FuncAnimation(fig, plot_in_polar, frames=len(primes), init_func=init, interval = 20) # 先保存再显示,避免画布资源被提前释放 animator.save(r'D:\primes.gif', writer='pillow') plt.show()
关键修改说明
- 新增
plt.xlim、plt.ylim配置,匹配坐标取值范围 - 初始帧改为返回第一个有效坐标,兼容旧版本matplotlib的参数校验规则
- 给
FuncAnimation指定frames参数,控制迭代次数不超过坐标数组长度 - 调整
save和plt.show的执行顺序,优先完成动画保存 - 保存GIF时指定
writer='pillow',规避缺省写入器不存在的问题
内容的提问来源于stack exchange,提问作者Eliran Turgeman
相关产品推荐
相关产品推荐

