DEBUG.WIKI
OnlineSIM:在线接收短信,虚拟号码租用
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →

marker=4 能画,np.int64(4) 却报 Unrecognized marker style

Matplotlib 3.10.3 可把 NumPy 整数标记误当成顶点输入,导致 marker 识别失败。说明标记边界转换和 3.11.2 的正式分派。

同样的标记编号,marker=4 可以绘图,marker=np.int64(4) 却报 Unrecognized marker style np.int64(4),更深一层还可能提示 vertices 必须是二维数组。先检查标记值的实际类型,不要把折线数据改造成二维顶点来迎合这个报错。

Matplotlib 3.10.3 有这条具体路径。编号经过 pandas 列或 NumPy 整数数组后,取出的标量可能变为 np.int64;值仍等于 4,但旧的分派没有把它送到内置数字标记分支,随后尝试按自定义 Path 顶点解释标量,因而失败。

在标记进入绘图库的边界转换整数

只处理已经确定代表内置数字标记的 NumPy 整数标量,可显式转成 Python int:

import numpy as np
import matplotlib.pyplot as plt

marker = np.array([4], dtype=np.int64)[0]
if isinstance(marker, np.integer):
    marker = int(marker)
fig, ax = plt.subplots()
ax.plot([1, 2, 3], marker=marker)

转换只作用于 marker,不修改 x、y 数据或整张 DataFrame。数字必须是 Matplotlib 支持的内置标记编号;把任意整数转换成 int,并不会创造一个新标记。

不要把所有标记统一 int()。字符串 "4" 与整数 4 表达的标记不同;顶点数组、Path、元组形式以及 MarkerStyle 对象也各有接口。配置文件把数字保存成字符串时,应按配置约定解析,不能因二者看起来相似就随意互换。

检查转换发生在整条图形管线的末端

在数据进入 pandas 时指定 object dtype,有助于避免部分自动类型转换,但不保证后续分组、拼接和重建都保留原标量类型。第三方绘图库还可能在图例或布局中再次创建 Line2D,因此只修主绘图区的一次调用,可能仍漏掉图例。

如果标记由第三方包装器产生,应检查它支持的修正版本或参数入口,不编辑 Matplotlib 私有分派,也不对不受控代码全局替换 NumPy 标量类型。应用自己控制的转换应放在实际提交 marker 的边界。

正式分派已接受可哈希的内置键

Matplotlib 3.11.2 的正式 MarkerStyle 会对可哈希、且存在于内置标记字典的值采用对应标记函数,能够覆盖这里的 NumPy 整数键。项目采用包含该处理的版本后,仍应保留原管线和 dtype 复查,不只用一个手写 Python int 验证。

验收比较 Python int 与 NumPy 整数标量的实际图形,并覆盖图例、保存输出以及原来就支持的字符串和自定义标记。不要只确认错误消失,却让标记形状发生变化。若 marker 值本来不在支持范围,应修输入配置,而不是继续放宽识别规则。