C++使用pbPlots生成SIR模拟可视化PNG文件损坏不可读问题求助
问题根因
- 多系列配置时变量名写错:创建
series2、series3对象后,所有属性赋值依然操作第一个series指针,导致后两个系列没有有效配置,绘图逻辑触发异常,生成空PNG文件。 - 向量长度不匹配:S/I/R三个数据向量初始化长度为
population,但X轴向量xPos长度为numDays,当numDays > population时会出现数组越界,进一步导致绘图失败。 - 绘图参数矛盾:设置了实线类型,但
linearInterpolation参数为false,该状态下仅绘制散点不会绘制连线。
修复步骤
1. 修正多系列赋值错误
将series2、series3的属性赋值操作对象替换为对应指针,示例如下:
// 第二个感染人数系列配置 ScatterPlotSeries* series2 = GetDefaultScatterPlotSeriesSettings(); series2->xs = &xPos; series2->ys = &I; series2->linearInterpolation = true; series2->lineType = toVector(L"solid"); series2->color = CreateRGBColor(0, 1, 0); // 第三个移除人数系列配置 ScatterPlotSeries* series3 = GetDefaultScatterPlotSeriesSettings(); series3->xs = &xPos; series3->ys = &R; series3->linearInterpolation = true; series3->lineType = toVector(L"solid"); series3->color = CreateRGBColor(0, 0, 0);
最小复现代码中的series2配置也按照相同逻辑修改即可。
2. 修正向量长度初始化
S/I/R三个向量需要存储每天的统计数据,长度应该设置为numDays + 1(避免循环中访问i+1时下标越界):
vector<double> S(numDays + 1, 0.0); vector<double> I(numDays + 1, 0.0); vector<double> R(numDays + 1, 0.0);
3. 修正绘图参数
如果需要绘制连续趋势线,将所有系列的linearInterpolation属性设置为true即可,若仅需要散点可保留为false。
修改完成后重新编译运行,即可导出正常的PNG图片。
内容的提问来源于stack exchange,提问作者Brandon Pyle
相关产品推荐
相关产品推荐

