我目前正在编写一个模块,该模块应该采用二维函数的一些数据点(一个3 x N矩阵),并根据这些点绘制近似的等高线图(用户提供拟合的函数和变量)。 “标题”看起来像这样:
project4[dataPoints_, functionList_, fittingVarsList_, plotArgs___] :=
Module[{fitFunc, functionContourPlot, dataPointsXY, pointsPlot,
xList, yList},
使用示例:
project4[data, {1, x, y, x y, x^2, y^2}, {x, y}]
(其中data = {{x1,y1,f1} ...})
在检查参数是否有效后,我会这样做:
fitFunc = Fit[dataPoints, functionList, fittingVarsList];
获得近似值。 然后我想通过这样做获得它的情节:
functionContourPlot = ContourPlot[fitFunc, {fittingVarsList[[1]], xMin, xMax},{fittingVarsList[[2]],yMin, yMax};
导致错误:
ContourPlot :: write:{x,y} [[1]]中的标记部分受保护。显示:: gcomb: “无法合并图形对象 显示[ContourPlot [fitFunc $ 2187 {{X,Y} [[1]],XMIN,XMAX},{{X,Y} [[2]],YMIN,YMAX}],“
我做错了什么?
答案 0 :(得分:3)
问题是ContourPlot
具有属性HoldAll
,这会阻止Part
评估。
Attributes@ContourPlot
您可以像这样修复它。
data = {{6, 4, 7.92}, {6, 5, 9.31}, {6, 6, 9.74},
{7, 4, 11.24}, {7, 5, 12.09}, {7, 6, 12.62},
{8, 4, 14.31}, {8, 5, 14.58}, {8, 6, 16.16}};
fittingVarsList = {x, y};
{xMin, xMax} = Through[{Min, Max}@data[[All, 1]]];
{yMin, yMax} = Through[{Min, Max}@data[[All, 2]]];
fitFunc = Fit[data, {1, x, y}, {x, y}]
这再现了问题: -
functionContourPlot = ContourPlot[fitFunc,
{fittingVarsList[[1]], xMin, xMax},
{fittingVarsList[[2]], yMin, yMax}];
使用With
创建局部变量可以解决问题: -
functionContourPlot =
With[{a = fittingVarsList[[1]], b = fittingVarsList[[2]]},
ContourPlot[fitFunc, {a, xMin, xMax}, {b, yMin, yMax}]]
如果您从HoldAll
的属性中移除ContourPlot
,则第一个版本可以正常运行...
Unprotect@ContourPlot;
ClearAttributes[ContourPlot, HoldAll]
......但这将是鲁莽的编程。