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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:51:03