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]}]

default

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]}]

ColorList 3

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.

Author: Community, 2011-03-22

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]

Tutaj wpisz opis obrazka


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]

Tutaj wpisz opis obrazka


Plot[...] i Plot[..., PlotStyle -> Automatic] są spójne:

Plot[fns, {x, -1, 1}]
Plot[fns, {x, -1, 1}, PlotStyle -> Automatic]

Tutaj wpisz opis obrazkaTutaj wpisz opis obrazka


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}}]

Tutaj wpisz opis obrazkaTutaj wpisz opis obrazka


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]

Tutaj wpisz opis obrazka


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.

 28
Author: Mr.Wizard,
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]}]

wyjście z powyższego kodu

HTH

 22
Author: Janus,
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:

Tutaj wpisz opis obrazka

Nie działa dla:

Plot[{Sin[x], Sin[2 x], Sin[3 x]}, {x, 0, 2 Pi}, 
 PlotStyle -> {Red, Green, Blue}]
 10
Author: Dr. belisarius,
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.

 4
Author: Mr.Wizard,
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