Gnuplot直接导出PDF与Qt绘图后导出PDF结果不一致问题
Gnuplot filledcurves导出PDF时斜率异常问题
我尝试使用Gnuplot的filledcurves绘制包含分布均值及其标准差的图形,通过设置terminal为PDF来导出图形。但当分布数据点超出y轴显示范围[-100:100]时,发现曲线斜率异常;而先使用Qt绘图再手动导出为PDF时,结果却符合预期。
以下是最小可复现代码:
reset session set terminal pdf set output "~/MWE_results.pdf" set yr[-100 : 100] $Data <<EOD 40 0.000011 -0.002104 0.002126 20 0.240582 -4.877879 5.359043 10 0.926508 -9.378468 11.231484 5 4.794549 -19.298995 28.888093 2.5 84.993925 -6679.709571 6849.697422 1.25 6.220374 -3980.189531 3992.630280 EOD set style fill transparent solid 0.1 plot $Data u 1:2 w lp pt 7 lc rgb "black" ti "Mean value of my distribution", \ $Data u 1:3:4 w filledcurves lc rgb "red" ti "Std devation" unset output unset term
直接导出PDF的结果中曲线斜率存在问题(已圈出异常部分),而Qt绘图后导出的PDF结果与数据一致。请问这是什么原因导致的?
问题原因
这是由于Gnuplot的PDF终端默认对超出坐标轴范围的数据点执行自动裁剪,但filledcurves在处理被裁剪的点时,会直接将裁剪后的点连接到坐标轴边界,而非遵循数据的实际趋势,进而导致斜率异常。而Qt终端的裁剪逻辑不同,它会保留数据的原始趋势,即使点超出显示范围,也会按照真实数据连接曲线,手动导出PDF时结果自然符合预期。
解决方法
方法一:禁用PDF终端的裁剪功能
在设置PDF终端时添加noclip参数,让Gnuplot保留所有数据点的原始位置:
set terminal pdf noclip
这样filledcurves会按照真实数据绘制曲线,导出的PDF结果将与Qt终端一致。
方法二:手动截断超出范围的数据点
如果希望保持坐标轴范围不变,同时避免曲线超出显示区域,可以使用clip函数将超出[-100,100]的数据点强制设置为边界值:
plot $Data u 1:2 w lp pt 7 lc rgb "black" ti "Mean value of my distribution", \ $Data u 1:(clip($3,-100,100)):(clip($4,-100,100)) w filledcurves lc rgb "red" ti "Std devation"
这种方式能让曲线斜率保持合理,同时不会超出设定的y轴显示范围。
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

