Graphics 为什么';插入项是否显示在绘图的序言中?

Graphics 为什么';插入项是否显示在绘图的序言中?,graphics,wolfram-mathematica,Graphics,Wolfram Mathematica,我为这个问题的长度道歉。我目前的Mathematica编程项目涉及复制我的雇佣机构对于时间序列的出版质量图的非常具体的商业规则。其中一个规则是多面板图形的面板标题和副标题位于绘图区域顶部附近的中心。使用Prolog和Inset可以很好地工作,直到我重新定义了该函数的位,以允许也包含显式Prolog元素。然后仅显示在Prolog选项中传递的项目,而不显示面板标题和副标题。如果没有显式的Prolog选项,面板标题和副标题显示良好 为了进一步说明,假设函数体都在一个大的模块中,包括局部变量pl=Opt

我为这个问题的长度道歉。我目前的Mathematica编程项目涉及复制我的雇佣机构对于时间序列的出版质量图的非常具体的商业规则。其中一个规则是多面板图形的面板标题和副标题位于绘图区域顶部附近的中心。使用
Prolog
Inset
可以很好地工作,直到我重新定义了该函数的位,以允许也包含显式
Prolog
元素。然后仅显示在
Prolog
选项中传递的项目,而不显示面板标题和副标题。如果没有显式的
Prolog
选项,面板标题和副标题显示良好

为了进一步说明,假设函数体都在一个大的
模块中,包括局部变量
pl=OptionValue[Prolog]
mp=OptionValue[MultiPanel]

再往下一点就是这个定义(
ppl
title
subtitle
也被定义为局部变量,
Rfont
framecol
是包中其他地方定义的常量,即
“Arial”
“Black”
):

就目前而言,一切都很好。如果选项
MultiPanel
(因此
mp
)不是
False
,并且没有显式设置
Prolog
,则使用
Inset
。但是如果设置了prolog,例如,
prolog->{Text[“test”,Scaled[{0.6
,0.5
}]},则
Inset
不显示,只显示
Text
元素

我把他们联系在一起的方式没有问题。捕获并打印
ppl的值
给出:

{Inset[{{Style["This is a test", LineColor -> GrayLevel[0], 
FrontFaceColor -> GrayLevel[0],   BackFaceColor -> GrayLevel[0], 
GraphicsColor -> GrayLevel[0], FontFamily -> "Arial", FontSize -> 20, 
FontColor -> GrayLevel[0]]}, 
{Style["Year-ended percentage change", LineColor -> GrayLevel[0], 
FrontFaceColor -> GrayLevel[0], BackFaceColor -> GrayLevel[0], 
GraphicsColor -> GrayLevel[0], FontFamily -> "Arial", FontSize -> 16, 
FontColor -> GrayLevel[0]]}}, 
Scaled[{0.5, 0.98}], {Center, Top}], Text["test", Scaled[{0.6, 0.5}]]}
(是的,我将在另一个问题中提出一系列未记录的选项。)


有人知道是否有什么东西阻止了
Prolog
(或
Epilog
)在一组图形选项中组合
Inset
元素和其他东西吗?

由于您没有给出有效的代码片段,我不确定其中出了什么问题

我的简单示例如何不复制您正在尝试的内容

plot = Plot[x^2, {x, -5, 5}, Prolog -> Inset[Style[Text[":) = \[HappySmiley]"], Large]]]


由于您没有给出一段有效的代码,我不确定其中出了什么问题

我的简单示例如何不复制您正在尝试的内容

plot = Plot[x^2, {x, -5, 5}, Prolog -> Inset[Style[Text[":) = \[HappySmiley]"], Large]]]


我现在觉得有点傻。我解决了这个问题。让我看看能不能解释清楚

假设您有一个自定义函数(例如,
XYZPlot
),它是在内置函数(例如,
DateListPlot
)的基础上构建的。假设您想将一些选项传递给
DateListPlot
,并处理一些特定于
XYZPlot
的选项。然后,在传递应用于自定义函数的默认选项之前,您可能希望显式传递用户包含的任何选项。这是一个玩具示例:通常,您会使用
SetOptions
等将默认
PlotRange
设置为自定义函数的一个选项

defaultplotrange = {1,5};
XYZPlot[args___,opts:OptionsPattern[{XYZPlot,DateListPlot}]]:=
  DateListPlot[args,Sequence @@ FilterRules[{opts}, Options[DateListPlot]],
    PlotRange->defaultplotrange]
到目前为止还不错。但是,如果您希望捕获某个选项的值并对其进行修改,即使用户在调用该函数时为其提供了明确的值,例如,如果其他选项设置为
True
,则添加[ahem]面板标题,那么您不能将该选项放在
FilterRules
位之后。它必须提前到来。否则将使用用户提供的
Prolog
值,而不是添加位的值。所以正确的方法是这样做

defaultplotrange = {1,5};
XYZPlot[args___,opts:OptionsPattern[{XYZPlot,DateListPlot}]]:=
  With[{pl=OptionValue[Prolog],mp=OptionValue[MultiPanel]},
  DateListPlot[args,
  Prolog -> If[mp===False,pl,Join[pl,{Inset[(* something else *)]}]],
  Sequence @@ FilterRules[{opts}, Options[DateListPlot]],
    PlotRange->defaultplotrange]]

很抱歉打扰大家。

我现在觉得有点傻。我解决了这个问题。让我看看能不能解释清楚

假设您有一个自定义函数(例如,
XYZPlot
),它是在内置函数(例如,
DateListPlot
)的基础上构建的。假设您想将一些选项传递给
DateListPlot
,并处理一些特定于
XYZPlot
的选项。然后,在传递应用于自定义函数的默认选项之前,您可能希望显式传递用户包含的任何选项。这是一个玩具示例:通常,您会使用
SetOptions
等将默认
PlotRange
设置为自定义函数的一个选项

defaultplotrange = {1,5};
XYZPlot[args___,opts:OptionsPattern[{XYZPlot,DateListPlot}]]:=
  DateListPlot[args,Sequence @@ FilterRules[{opts}, Options[DateListPlot]],
    PlotRange->defaultplotrange]
到目前为止还不错。但是,如果您希望捕获某个选项的值并对其进行修改,即使用户在调用该函数时为其提供了明确的值,例如,如果其他选项设置为
True
,则添加[ahem]面板标题,那么您不能将该选项放在
FilterRules
位之后。它必须提前到来。否则将使用用户提供的
Prolog
值,而不是添加位的值。所以正确的方法是这样做

defaultplotrange = {1,5};
XYZPlot[args___,opts:OptionsPattern[{XYZPlot,DateListPlot}]]:=
  With[{pl=OptionValue[Prolog],mp=OptionValue[MultiPanel]},
  DateListPlot[args,
  Prolog -> If[mp===False,pl,Join[pl,{Inset[(* something else *)]}]],
  Sequence @@ FilterRules[{opts}, Options[DateListPlot]],
    PlotRange->defaultplotrange]]

很抱歉打扰大家。

搁置:您可以通过
If[Length[pl]>0,Join[{“long”,“bit of”,“code”},pl],{“long”,“bit of”,“code”}]
Join[{“long”,“bit of”,“code”},If[Length[pl]>0,pl,{}]
来简化您的代码,这样看来
ppl
就是您想要的样子(除了那些未知选项之外). 我可以将它作为一个
Prolog
包含在绘图中,它看起来很好。如果是这样的话,那么我不认为您已经给了我们实际发生问题的代码。@Simon:+1。我一直在努力解决
Prolog
问题,时间太长了,以至于我忘记了
Join[{a,b},{}]
返回
{a,b}
。我试图避免在显示为
Prolog
的列表中出现
Null
。Duh.实际上,由于
Prolog
的默认值是
{}
,也许人们甚至不需要
If
?旁白:你可以通过
If[Length[pl]>0,Join[{“long”,“bit of”,“code”},pl],{“long”,“bit of”,“code”}]
Join[{“long”,“bit of”,“bit of”,“c]来简化你的代码