The present state of affairs
The kind of manual manipulation demonstrated by kglr should theoretically not be necessary. There may have been some problems in the initial version 10 release but in either 10.0.2 or 10.1.0 many Themes already combine correctly. Emulating his penultimate example:
Plot[Evaluate@Table[BesselJ[n, x], {n, 5}], {x, 0, 10}, ImageSize -> 400,
PlotTheme -> {"Monochrome", "VibrantColor", "Detailed"}]
The last example doesn't work out so well as "Monochrome"
dominates the plot:
ListLinePlot[Table[BesselJ[n, x], {n, 5}, {x, 0, 10, .3}], Filling -> Axis,
ImageSize -> 500,
PlotTheme -> {"Detailed", "Monochrome", "OpenMarkersThick", "VibrantColor"}]
Low-level PlotTheme definitions
To find out what went wrong with "Monochrome"
we can look at its actual definition as I detailed in the Advanced method section of Is it possible to define a new PlotTheme?. First load step
, then:
Defer @@ step @ System`PlotThemeDump`resolvePlotTheme["Monochrome", "ListLinePlot"]
Themes`SetWeight[
Join[{AxesStyle -> System`PlotThemeDump`monoColor,
BaseStyle -> System`PlotThemeDump`monoColor,
FrameStyle -> System`PlotThemeDump`monoColor,
FrameTicksStyle -> System`PlotThemeDump`monoColor,
GridLinesStyle ->
Directive[System`PlotThemeDump`monoColor, AbsoluteThickness[1],
AbsoluteDashing[{1, 2}]], LabelStyle -> System`PlotThemeDump`monoFont,
"DefaultThickness" -> Directive[CapForm["Butt"], AbsoluteThickness[1.6]],
"DefaultColor" -> System`PlotThemeDump`monoColor,
"DefaultDashing" -> {AbsoluteDashing[{}], AbsoluteDashing[{6, 2}],
AbsoluteDashing[{2, 2}], AbsoluteDashing[{6, 2, 2, 2}], AbsoluteDashing[{12, 2}],
AbsoluteDashing[{12, 2, 2, 2, 2, 2}], AbsoluteDashing[{24, 2, 8, 2}],
AbsoluteDashing[{24, 2, 2, 2}]}, TicksStyle -> System`PlotThemeDump`monoColor},
System`PlotThemeDump`resolvePlotTheme["PlotMarkers",
"ListLinePlot"]], System`PlotThemeDump`$MonochromeWeight]
Of note:
- Among other things the
BaseStyle
option is being set;
- The Theme options are given a weight of
System`PlotThemeDump`$MonochromeWeight
BaseStyle
precedence
BaseStyle
takes precedence over the method used by "VibrantColor"
(which is to set the value of System`PlotThemeDump`$ThemeColorIndexed
as can be seen from viewing its definition). Therefore we can prevent that problem by setting BaseStyle -> {}
as user options take further precedence:
ListLinePlot[Table[BesselJ[n, x], {n, 5}, {x, 0, 10, .3}], Filling -> Axis,
ImageSize -> 500,
PlotTheme -> {"Detailed", "Monochrome", "OpenMarkersThick", "VibrantColor"},
BaseStyle -> {}]
SetWeight
precedence
The plot markers are still wrong however. This is because System`PlotThemeDump`$MonochromeWeight
is higher than System`PlotThemeDump`$ComponentWeight
(used by most other Themes) and this gives it priority. If we momentarily lower that value with Block
we finally get the target styling. :
Block[{System`PlotThemeDump`$MonochromeWeight = 0.4},
ListLinePlot[Table[BesselJ[n, x], {n, 5}, {x, 0, 10, .3}], Filling -> Axis,
ImageSize -> 500,
PlotTheme -> {"Detailed", "Monochrome", "OpenMarkersThick", "VibrantColor"},
BaseStyle -> {}
]
]
Customization
For future use it would be better to define a new Theme with only the dashing we want:
System`PlotThemeDump`resolvePlotTheme["monoDash", "Plot" | "ListPlot" | "ListLinePlot"] :=
Themes`SetWeight[{"DefaultDashing" -> {AbsoluteDashing[{}], AbsoluteDashing[{6, 2}],
AbsoluteDashing[{2, 2}], AbsoluteDashing[{6, 2, 2, 2}], AbsoluteDashing[{12, 2}],
AbsoluteDashing[{12, 2, 2, 2, 2, 2}], AbsoluteDashing[{24, 2, 8, 2}],
AbsoluteDashing[{24, 2, 2, 2}]}}, System`PlotThemeDump`$ComponentWeight]
Now we can use it with other Themes with a weight of $ComponentWeight
and it just works:
ListLinePlot[Table[BesselJ[n, x], {n, 5}, {x, 0, 10, .3}], Filling -> Axis,
ImageSize -> 500,
PlotTheme -> {"Detailed", "OpenMarkersThick", "VibrantColor", "monoDash"}]
{"Frame","Monochrome"}
works correctly but{"ThickLines","Monochrome"}
does not affect line thickness and{"Monochrome","Frame"}
yields neither feature. $\endgroup$bugs
tag to the post. $\endgroup$