Jak zmienić domyślną ColorData używaną w wykresie Mathematica?
To pytanie prowadzi do ostatniego pytania jakie są standardowe kolory dla działek w Mathematica?
Tam ustalono, że domyślna paleta kolorów używana przez Plot
jest równoważna do ColorData[1]
(patrz uwaga na końcu). Można to zmienić za pomocą opcji PlotStyle
.
Moje pytanie brzmi jak możemy np. ustawić domyślną paletę kolorówColorData[3]
i niech ta domyślna wersja zmieni się ręcznie na inne aspekty stylizacji fabuły?
Więc, na przykład, zróbmy listę monomiałów i kilka ustawień dziarskich
fns = Table[x^n, {n, 0, 5}];
dash = Table[AbsoluteDashing[i], {i, 1, 6}];
Zauważ, że domyślne kolory wykresu przetrwają inne opcje stylizacji:
GraphicsRow[{Plot[fns, {x, -1, 1}], Plot[fns, {x, -1, 1}, PlotStyle -> dash]}]
Kolory na wykresie mogą być zmieniane lokalnie przez ustawienie PlotStyle
, takie jak
Plot[fns, {x, -1, 1}, PlotStyle -> ColorData[3, "ColorList"]]
Lub ustawiając domyślne opcje. Zróbmy to i uruchom ponownie komendę GraphicsRow
:
SetOptions[Plot, PlotStyle -> ColorData[3, "ColorList"]];
GraphicsRow[{Plot[fns, {x, -1, 1}], Plot[fns, {x, -1, 1}, PlotStyle -> dash]}]
Zauważ, że nowe kolory w domyślnej styl wykresu jest nadpisywany przez użycie PlotStyle -> dash
. Można to naprawić ręcznie, w tym przypadku za pomocą Transpose[{dash, ColorData[3, "ColorList"][[1 ;; 6]]}]
, ale nie chcesz tego robić za każdym razem.
Zmiana domyślnej PlotStyle
Zawsze będzie miała ten problem.
Można się spodziewać, że gdzieś będzie domyślne ColorData
lub ustawienie schematu kolorów,
ale nie byłem w stanie go znaleźć.
Zwróć uwagę, że uruchamianie hakera
Unprotect[ColorData];
ColorData[1] := ColorData[3]
ColorData[1, a__] := ColorData[3, a]
Protect[ColorData];
Nie naprawia domyślnych kolorów wykresu.
Co prawdopodobnie oznacza, że domyślne wewnętrzne Plot
nie wykonaj wyraźne wezwanie do ColorData
...
Warto również zauważyć, że podczas uruchamiania Trace[Plot[...],TraceInternal -> True]
kolory wydają się pojawiać znikąd! Patrzyłem na taki ślad próbując odpowiedzieć to ostatnie pytanie związane z tym, jak Mathematica określa liczbę linii, a tym samym kolory, których potrzebuje na wykresie.
4 answers
Aktualizacja Sierpień 2014
Poniższe rozwiązanie starsze zostało poprawione, aby działało w ostatnich wersjach (9 i 10).
W tym samym czasie jednak wprowadzenie PlotTheme
funkcjonalność sprawia, że moje rozwiązanie jest w dużej mierze akademickie, ponieważ motywy fabuły są zaprojektowane tak, aby łączyć się w ten sam sposób. Jeśli żaden istniejący motyw nie ma pożądanego stylu, możesz utworzyć własny.
Ten przykład pokazuje ustawienie nowych domyślnych kolorów wykresu, a także niestandardowe grubość i te poprawnie łączące się z dyrektywami dashing w PlotStyle
:
System`PlotThemeDump`resolvePlotTheme["Thick5", "Plot"] :=
Themes`SetWeight[{"DefaultThickness" -> {AbsoluteThickness[5]}},
System`PlotThemeDump`$ComponentWeight]
SetOptions[Plot, PlotTheme -> {"DarkColor", "Thick5"}];
fns = Table[x^n, {n, 0, 5}];
dash = Table[AbsoluteDashing[i], {i, 1, 6}];
Plot[fns, {x, -1, 1}, PlotStyle -> dash]
Starsze Rozwiązanie
Poniższe zaktualizowane rozwiązanie jest oparte na istniejących rozwiązaniach Janusa i belisariusa ze znacznym rozszerzeniem i ulepszeniem.
Funkcje pomocnicze
ClearAll[toDirective, styleJoin]
toDirective[{ps__} | ps__] :=
Flatten[Directive @@ Flatten[{#}]] & /@ {ps}
styleJoin[style_, base_] :=
Module[{ps, n},
ps = toDirective /@ {PlotStyle /. Options[base], style};
ps = ps /. Automatic :> Sequence[];
n = LCM @@ Length /@ ps;
MapThread[Join, PadRight[#, n, #] & /@ ps]
]
Główna funkcja
pp
to lista funkcji wykresu, na które chcesz wpłynąć.
sh
jest potrzebne do obsługi działek przelotowych jak LogPlot
, LogLinearPlot
, DateListLogPlot
, itd.
pp = {Plot, ListPlot, ParametricPlot, ParametricPlot3D};
Unprotect /@ pp;
(#[a__, b : OptionsPattern[]] :=
Block[{$alsoPS = True, sh},
sh = Cases[{b}, ("MessagesHead" -> hd_) :> hd, {-2}, 1] /. {{z_} :> z, {} -> #};
With[{new = styleJoin[OptionValue[PlotStyle], sh]}, #[a, PlotStyle -> new, b]]
] /; ! TrueQ[$alsoPS];
DownValues[#] = RotateRight[DownValues@#]; (* fix for versions 9 and 10 *)
) & /@ pp;
Użycie
Teraz różne typy wykresu mogą być indywidualnie stylizowane w następujący sposób:
SetOptions[Plot, PlotStyle -> ColorData[3, "ColorList"]];
Lub w grupach (tutaj używając pp
zdefiniowanych powyżej):
SetOptions[pp, PlotStyle -> ColorData[3, "ColorList"]];
Przykłady
PlotStyle
opcje są następnie automatycznie dodawane:
fns = Table[x^n, {n, 0, 5}];
dash = Table[AbsoluteDashing[i], {i, 1, 6}];
Plot[fns, {x, -1, 1}, PlotStyle -> dash]
Plot[...]
i Plot[..., PlotStyle -> Automatic]
są spójne:
Plot[fns, {x, -1, 1}]
Plot[fns, {x, -1, 1}, PlotStyle -> Automatic]
Przelotowe działki (te, które wywołują Plot
, ListPlot
lub ParametricPlot
) można nadać własny styl:
SetOptions[LogPlot, PlotStyle -> ColorData[2, "ColorList"]];
LogPlot[{Tanh[x], Erf[x]}, {x, 1, 5}]
LogPlot[{Tanh[x], Erf[x]}, {x, 1, 5}, PlotStyle -> {{Dashed, Thick}}]
PlotStyle
obsługę można rozszerzyć na różne typy wykresu .
Dodałem ParametricPlot3D
powyżej jako przykład:
fns = {1.16^v Cos[v](1 + Cos[u]), -1.16^v Sin[v](1 + Cos[u]), -2 1.16^v (1 + Sin[u])};
ParametricPlot3D[fns, {u, 0, 2 Pi}, {v, -15, 6},
Mesh -> None, PlotStyle -> Opacity[0.6], PlotRange -> All, PlotPoints -> 25]
Uwaga Wdrożeniowa
W obecnym stanie zresetowanie SetOptions[..., PlotStyle -> Automatic]
przywróci kolory do oryginalnych wartości domyślnych. Jeśli takie zachowanie jest niepożądane, kod można zmodyfikować, aby nadać inny domyślny kolor, w sposób funkcji also
Janusa, na której wyraźnie opiera się moja styleJoin
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:56:06
Tutaj jest jedno podejście -- najtrudniejsze było oszacowanie, w jaki sposób Opcja PlotStyle
zostanie przekształcona w listę dyrektyw. Myślę, że to działa jako wewnętrzna implementacja:
canonicalPlotStyle::usage =
"Turn a PlotStyle option into the canonical form {_Directive...}";
canonicalPlotStyle[ps_] := Replace[ps, {
a_List :> (Flatten[Directive @@ Flatten[{#}]] &) /@ a,
a_ :> {Flatten@Directive[a]}}]
Budowanie na canonicalPlotStyle
jest teraz tylko kwestią połączenia dwóch list o nierównej długości:
also::usage =
"Combines a specified plotstyle with the current defaults as \
specified by Options.";
also[plotstyle_] := Module[{ps, n},
ps = canonicalPlotStyle /@ {
(PlotStyle /. Options[Plot]) /. Automatic :> ColorData[1, "ColorList"],
plotstyle};
n = LCM @@ (Length /@ ps);
Join @@@ Transpose[Flatten[Table[#, {n/Length[#]}], 1] & /@ ps ]]
To wymaga wywołania funkcji podczas wykresu, ale nie mogłem zobaczyć żadnego sposobu obejścia tej części:
SetOptions[Plot, PlotStyle -> ColorData[3, "ColorList"]];
GraphicsRow[{Plot[fns, {x, -1, 1}],
Plot[fns, {x, -1, 1}, PlotStyle -> also@dash]}]
HTH
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-23 03:16:45
To jest praca w toku, zamieszczam ją, ponieważ nie jestem pewien, czy uda mi się ją dokończyć, a może ktoś chce.
Ideą jest połączenie cudownego rozwiązania Janusa z tą miłą sztuczką , aby przedefiniować fabułę [] standardowe zachowanie.
Poniższy program działa dla dużego podzbioru strony pomocy dla Plot [], ale nie działa dla dwóch lub trzech. Kod nie jest uporządkowany, tylko szkic z resztkami.
Unprotect[Plot];
Plot[argsANDopts___] :=
Block[
{$inMsg = True, result, also, canonicalPlotStyle, opts, args,
optPstyle},
If[(opts =
FilterRules[Cases[{argsANDopts}, _Rule], Options[Plot]]) == {},
opts = {Axes -> (Axes /. Options[Plot])}];(*Anything not null*)
args = Cases[{argsANDopts}, Except@_Rule];
If[(optPstyle = Cases[opts, Rule[PlotStyle, y__] :> y]) == {},
optPstyle = (PlotStyle /. Options[Plot])];
canonicalPlotStyle[ps_] :=
Replace[ps, {a_List :> (Flatten[Directive @@ Flatten[{#}]] &) /@
a, a_ :> {Flatten@Directive[a]}}];
also[plotstyle_] :=
Module[{ps, n},
ps = canonicalPlotStyle /@ {(PlotStyle /. Options[Plot]) /.
Automatic :> ColorData[1, "ColorList"], plotstyle};
n = LCM @@ (Length /@ ps);
Join @@@ Transpose[Flatten[Table[#, {n/Length[#]}], 1] & /@ ps]];
(*Print@opts;
Print@args;
Print@optPstyle;
Print@Evaluate@also[opts];*)
result = Plot[
Evaluate@Sequence@@args,
PlotStyle -> also[optPstyle],
Evaluate@Sequene@@opts
];
result
] /; ! TrueQ[$inMsg];
SetOptions[Plot, PlotStyle -> ColorData[3, "ColorList"]];
Protect[Plot];
Próbki:
Nie działa dla:
Plot[{Sin[x], Sin[2 x], Sin[3 x]}, {x, 0, 2 Pi},
PlotStyle -> {Red, Green, Blue}]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:35:03
Najbardziej prawdopodobnym źródłem danych o stylu, moim zdaniem, jest:
System`Private`$PlotStyleFunction[5]
{{Hue[0.67, 0.6, 0.6]}, {Hue[0.906068, 0.6, 0.6]}, {Hue[0.142136, 0.6, 0.6]}, {Hue[0.378204, 0.6, 0.6]}, {Hue[0.614272, 0.6, 0.6]}}
Jednak użycie Unprotect
i zmiana tej funkcji nie wpływa na pożądaną zmianę w Plot
. Być może połączenie jest poza zasięgiem normalnych metod.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 08:25:22