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 值本来不在支持范围,应修输入配置,而不是继续放宽识别规则。


