我正在尝试在加载后重新定义PlotLegends
包的选项,
但我得到了例如
Needs["PlotLegends`"]
SetOptions[ListPlot,LegendPosition->{0,0.5}]
=> SetOptions::optnf: LegendPosition is not a known option for ListPlot.
我希望PlotLegends
包中的选项不会内置到Plot
和ListPlot
。
有没有办法重新定义PlotLegends
包的默认选项?
答案 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"}]
]
答案 1 :(得分:0)
LegendsPosition
在ListPlot
中无问题(至少对我而言)。您不会忘记使用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];
];
];
];