16

This can be useful if the curve is passing over both dark and light backgrounds (like well-done subtitles in movies).

Artes
  • 57,212
  • 12
  • 157
  • 245
Valerio
  • 1,982
  • 13
  • 23

5 Answers5

25

You could plot the curve twice, with two different styles:

Plot[{Sin[x], Sin[x]}, {x, 0, 2 Pi}, 
     PlotStyle -> {Directive[Thickness[0.03], White], Black}]

enter image description here

Changing the background to gray:

Plot[{Sin[x], Sin[x]}, {x, 0, 2 Pi}, 
     PlotStyle -> {Directive[Thickness[0.03], White], Black}, 
     Background -> Gray]

enter image description here

halirutan
  • 112,764
  • 7
  • 263
  • 474
Markus Roellig
  • 7,703
  • 2
  • 29
  • 53
21

Here is another approach, based on Filling option :

Plot[{Sin[x] - 0.02, Sin[x], Sin[x] + 0.02}, {x, 0, 2 Pi}, 
      PlotStyle -> {Gray, Black, Gray}, 
      Filling -> {1 -> {{3}, Yellow}}]

enter image description here

One problem may appear here, namely if a given function has a big absolute value of the derivative, then the strip becomes too thin. We can avoid this by adding a factor depending on the absolute value of its derivative, e.g.

Plot[{Sin[x]-0.035(1 + Abs[Sin'[x]]), Sin[x], Sin[x] + 0.035 (1 + Abs[Sin'[x]])}, {x, 0, 2 Pi}, 
     PlotStyle -> {Gray, Black, Gray},  Filling -> {1 -> {{3}, LightOrange}}]

enter image description here

For a more customized solution we can use also one of the wide range of ColorSchemes :

Plot[{Sin[x]-0.035 (1+ Abs[Sin'[x]]), Sin[x], Sin[x] +0.035 (1+ Abs[Sin'[x]])}, {x, 0, 2 Pi}, 
      PlotStyle -> {Thin, Thick, Thin},  ColorFunction -> "FruitPunchColors",  
      FillingStyle -> Opacity[0.1],  Filling -> {1 -> {3}}]

enter image description here

GraphicsRow[ 
    Table[  Plot[{Sin[x]- 0.035 (1+ Abs[Sin'[x]]), Sin[x], Sin[x]+ 0.035 (1+ Abs[Sin'[x]])},
                 {x, 0, 2 Pi}, PlotStyle -> {Thin, Thick, Thin}, 
                 ColorFunction -> i, FillingStyle -> Opacity[0.05], Filling -> {1 -> {3}}], 
          {i, {"Rainbow", "BlueGreenYellow", "DeepSeaColors"}}]]

enter image description here

Artes
  • 57,212
  • 12
  • 157
  • 245
15

A minor tweak to Markus' method, you may find utility in CapForm:

Table[
  Plot[{Sin[x], Sin[x]}, {x, 0, 2 Pi}, 
   PlotStyle ->
     {Directive[AbsoluteThickness[15], CapForm[c], White], 
      Directive[AbsoluteThickness[7], Blue]},
   ImageSize -> 400, PlotRangePadding -> 0.2, Frame -> True,
   Prolog -> 
    Inset[ExampleData[{"TestImage", "Sailboat"}], 
        Scaled@{0.5, 0.5}, Automatic, Scaled@{1, 2}]
   ],
  {c, {"Butt", "Round", "Square"}}
] // Column

Mathematica graphics

Mathematica graphics

Mathematica graphics

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
4

A minor variation of Markus' method, applying the effect as a post process using ReplaceAll. Every Line in the graphics is replaced with two Lines: a thicker copy and the original. The key thing is to localise the additional directives to the extra Line by wrapping it in a list, so that subsequent primitives do not pick up the thickness and colour changes.

For plots with many curves this might be a more convenient approach than explicitly duplicating the plot functions.

Plot[{Sin[x], Cos[x]}, {x, 0, 2 Pi}, PlotStyle -> {Yellow, White}, BaseStyle -> Thick] /. 
 l_Line :> {{Thickness[0.01], Black, CapForm["Round"], l}, l}

enter image description here

Simon Woods
  • 84,945
  • 8
  • 175
  • 324
3

Since V 13.3 there is Haloing:

Plot[Sin[x], {x, 0, 2 Pi},
 PlotStyle -> Haloing[White, 0, 8],
 PlotTheme -> "Marketing"]

enter image description here

eldo
  • 67,911
  • 5
  • 60
  • 168