c++使用matplotlibcpp,subplot() 报错问题(已解决)

解决C++使用matplotlibcpp.h调用subplot()时的运行时错误
在C++代码中使用matplotlibcpp.h绘制图形时遇到subplot()函数引发的运行时错误,原因是将参数传递为浮点数。通过将PyTuple_SetItem中的PyFloat_FromDouble替换为PyLong_FromDouble,解决了因类型不匹配导致的失败问题。
部署运行你感兴趣的模型镜像

使用 matplotlibcpp.h 在 C++ 代码中绘制图形plt::subplot();程序抛出运行时错误,

 PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot, args);
    if(!res) throw std::runtime_error("Call to subplot() failed.");

报错位置。

解决方法:在matplotlibcpp.h文件中把

PyTuple_SetItem(args, 0, PyFloat_FromDouble(nrows));
PyTuple_SetItem(args, 1, PyFloat_FromDouble(ncols));
PyTuple_SetItem(args, 2, PyFloat_FromDouble(plot_number));

改为

    PyTuple_SetItem(args, 0, PyLong_FromDouble(nrows));
    PyTuple_SetItem(args, 1, PyLong_FromDouble(ncols));
    PyTuple_SetItem(args, 2, PyLong_FromDouble(plot_number));

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

### Python Matplotlib `add_subplot` 方法报错解决方案 当使用 `add_subplot` 方法时,可能会遇到各种类型的错误。以下是常见的几种情况及其对应的解决方案: #### 1. 参数数量不匹配 如果调用 `figure.add_subplot()` 或 `plt.subplot()` 的时候传递的参数不符合其标准形式 `(numRows, numCols, plotNumber)`,则会触发异常。 - 正确的形式应为三个整数值表示网格布局以及子图位置[^4]。 ```python import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(1, 1, 1) # 表示创建一个1x1网格并选择第一个子图 ax.plot([1, 2, 3], [4, 5, 6]) plt.show() ``` #### 2. 子图编号超出范围 如果指定的 `plotNumber` 超过了实际可能的最大值,则会抛出索引越界类错误。最大允许值由公式计算得出:`max_plot_number = numRows * numCols`。 例如,在一个 2×2 网格中尝试访问第 5 个子图将会失败。 ```python # 错误示范 fig = plt.figure() try: ax = fig.add_subplot(2, 2, 5) # 尝试获取不存在的位置 except Exception as e: print(f"Error: {e}") # 修改后的正确版本 ax = fig.add_subplot(2, 2, 4) # 合法范围内最后一个子图 ``` #### 3. 不兼容的对象类型 有时开发者试图向非 Figure 对象应用 `.add_subplot()` 方法也会导致运行期崩溃。务必确认所使用的变量确实是一个合法的 Figure 实例[^2]。 ```python from matplotlib.backends.backend_agg import RendererAgg renderer = RendererAgg(width=800, height=600, dpi=72) try: renderer.add_subplot(1, 1, 1) # 这里RendererAgg并不支持此方法 except AttributeError as err: print(err) finally: del renderer correct_figure = plt.figure() valid_ax = correct_figure.add_subplot(1, 1, 1) ``` #### 4. 关键字参数冲突或缺失必要选项 部分情况下忘记提供某些必需的关键字参数或者存在同名覆盖也可能引起问题。比如设置自定义属性时未遵循官方文档建议的名字列表就会被拒绝接受。 ```python invalid_kwarg_fig = plt.figure() try: invalid_axis = invalid_kwarg_fig.add_subplot( 1, 1, 1, unknown_param="value") # 'unknown_param' is not recognized. except TypeError as te: print(te) else: pass finally: valid_kwargs_axes = [ {"projection": None}, {"polar": True} ] for kwargs_set in valid_kwargs_axes: good_axis = invalid_kwarg_fig.add_subplot(1, 1, 1, **kwargs_set) del invalid_kwarg_fig ``` --- ### 总结 通过以上分析可以看出,大多数关于 `add_subplot` 函数产生的问题是由于输入数据不合理造成的。只要严格按照 API 文档的要求传入合适的参数组合,并且保证操作目标确实是有效的 Figure 类型实例即可有效规避这些问题的发生。
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值