# How to plot a curve with border around the line?

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

-
Could you maybe give a sample of what you're expecting to see in the answers? – J. M. May 4 '12 at 10:21
A closely related question is How can I make a 2D line plot with a drop shadow under the line? – Jens May 5 '12 at 6:35

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


Changing the background to gray:

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


-
+1. Btw, when you add plots as images, you should try to export png-files from Mathematica because they don't suffer from the ringing artefacts at line borders. – halirutan May 4 '12 at 10:45
@halirutan, Thanks for the tip. In this case I don't see any differences between jpeg and png though. I will stick to png in the future. – Markus Roellig May 4 '12 at 10:47
Fixed it. Really close to hard lines or sharp dark/bright changes you see clutter. – halirutan May 4 '12 at 10:49
@halirutan: Thanks! – Markus Roellig May 4 '12 at 10:51
@MarkusRoellig, maybe add CapForm["Round"] to your Directive for a tidier appearance. – Simon Woods May 4 '12 at 13:02

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


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


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


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


-

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


-
+1 for the CapForm and the Background :) nice! – Markus Roellig May 4 '12 at 20:10

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}


-