PlotLegends`默认选项

时间:2011-09-23 14:01:16

标签: wolfram-mathematica

我正在尝试在加载后重新定义PlotLegends包的选项, 但我得到了例如

Needs["PlotLegends`"]
SetOptions[ListPlot,LegendPosition->{0,0.5}]
=> SetOptions::optnf: LegendPosition is not a known option for ListPlot.

我希望PlotLegends包中的选项不会内置到PlotListPlot

有没有办法重新定义PlotLegends包的默认选项?

3 个答案:

答案 0 :(得分:2)

问题实际上不在PlotLegends`的默认值中。要查看它,您应该检查ListPlot实现:

In[28]:= Needs["PlotLegends`"]
In[50]:= DownValues[ListPlot]
Out[50]=    
{HoldPattern[ListPlot[PlotLegends`Private`a:PatternSequence[___,
    Except[_?OptionQ]]|PatternSequence[],PlotLegends`Private`opts__?OptionQ]]:>
  PlotLegends`Private`legendListPlot[ListPlot,PlotLegends`Private`a,
    PlotLegend/.Flatten[{PlotLegends`Private`opts}],PlotLegends`Private`opts] 
      /;!FreeQ[Flatten[{PlotLegends`Private`opts}],PlotLegend]}

您从这里看到的是必须明确传递选项才能使其工作,而且必须存在PlotLegend选项。

实现目标的一种方法是使用我的option configuration manager,它通过传递本地选项来模仿全局选项。这是一个选项过滤可选的版本:

ClearAll[setOptionConfiguration, getOptionConfiguration, withOptionConfiguration];
SetAttributes[withOptionConfiguration, HoldFirst];
Module[{optionConfiguration}, optionConfiguration[_][_] = {};
   setOptionConfiguration[f_, tag_, {opts___?OptionQ}, filterQ : (True | False) : True] :=
      optionConfiguration[f][tag] = 
         If[filterQ, FilterRules[{opts}, Options[f]], {opts}];
   getOptionConfiguration[f_, tag_] := optionConfiguration[f][tag];
   withOptionConfiguration[f_[args___], tag_] := 
        f[args, Sequence @@ optionConfiguration[f][tag]];
];

要使用此功能,请首先定义配置和快捷方式宏,如下所示:

setOptionConfiguration[ListPlot,"myConfig", {LegendPosition -> {0.8, -0.8}}, False];
withMyConfig =   Function[code, withOptionConfiguration[code, "myConfig"], HoldAll];

现在,你走了:

withMyConfig[
   ListPlot[{#, Sin[#]} & /@ Range[0, 2 Pi, 0.1], PlotLegend -> {"sine"}]
]

enter image description here

答案 1 :(得分:0)

LegendsPositionListPlot中无问题(至少对我而言)。您不会忘记使用Needs["PlotLegends“]`?

来加载包

答案 2 :(得分:0)

@Leonid,我添加了setOptionConfiguration的可能性,将默认选项设置为f,而不必使用快捷方式宏。

我使用了Alexey Popkov在What is in your Mathematica tool bag?

中公开的技巧

示例:

Needs["PlotLegends`"];
setOptionConfiguration[ListPlot, "myConfig", {LegendPosition -> {0.8, -0.8}},SetAsDefault -> True]
ListPlot[{#, Sin[#]} & /@ Range[0, 2 Pi, 0.1], PlotLegend -> {"sine"}]

这是实施

Options[setOptionConfiguration] = {FilterQ -> False, SetAsDefault -> False};

setOptionConfiguration[f_, tag_, {opts___?OptionQ}, OptionsPattern[]] := 
    Module[{protectedFunction}, 

        optionConfiguration[f][tag] = 
            If[OptionValue@FilterQ, FilterRules[{opts}, 
                Options[f]]
                , 
                {opts}
            ];

        If[OptionValue@SetAsDefault, 
            If[(protectedFunction = MemberQ[Attributes[f], Protected]), 
                Unprotect[f];
            ];

            DownValues[f] = 
                Union[
                    {
                        (*I want this new rule to be the first in the DownValues of f*)
                        HoldPattern[f[args___]] :> 
                            Block[{$inF = True}, 
                                withOptionConfiguration[f[args], tag]
                            ] /; ! TrueQ[$inF]
                    }
                    , 
                    DownValues[f]
                ];

            If[protectedFunction, 
                Protect[f];
            ];
        ];
    ];