# Legends in combined Plot and ListPlot

I have a set of data

plotgamma6 = {{0.1, 14/15}, {0.2, 17/20}, {0.3, 11/15}, {0.4,
43/60}, {0.5, 2/3}, {0.6, 13/20}, {0.7, 7/12}, {0.8, 17/30}, {0.9,
17/30}, {1., 31/60}, {1.1, 31/60}, {1.2, 7/15}, {1.3,
7/15}, {1.4, 9/20}, {1.5, 9/20}, {1.6, 9/20}, {1.7, 13/30}, {1.8,
5/12}, {1.9, 2/5}, {2., 2/5}, {2.1, 2/5}, {2.2, 23/60}, {2.3,
23/60}, {2.4, 11/30}, {2.5, 11/30}, {2.6, 11/30}, {2.7,
7/20}, {2.8, 1/3}, {2.9, 1/3}, {3., 1/3}, {3.1, 1/3}, {3.2,
1/3}, {3.3, 19/60}, {3.4, 19/60}, {3.5, 19/60}, {3.6, 3/10}, {3.7,
3/10}, {3.8, 4/15}, {3.9, 1/4}, {4., 7/30}, {4.1, 13/60}, {4.2,
13/60}, {4.3, 13/60}, {4.4, 13/60}, {4.5, 13/60}, {4.6,
13/60}, {4.7, 13/60}, {4.8, 13/60}, {4.9, 13/60}, {5., 13/60}};
plotgamma10 = {{0.1, 93/100}, {0.2, 89/100}, {0.3, 83/100}, {0.4,
81/100}, {0.5, 37/50}, {0.6, 18/25}, {0.7, 17/25}, {0.8,
16/25}, {0.9, 61/100}, {1., 59/100}, {1.1, 14/25}, {1.2,
14/25}, {1.3, 13/25}, {1.4, 13/25}, {1.5, 49/100}, {1.6,
23/50}, {1.7, 23/50}, {1.8, 9/20}, {1.9, 9/20}, {2.,
43/100}, {2.1, 43/100}, {2.2, 21/50}, {2.3, 41/100}, {2.4,
2/5}, {2.5, 19/50}, {2.6, 37/100}, {2.7, 9/25}, {2.8, 7/20}, {2.9,
17/50}, {3., 33/100}, {3.1, 29/100}, {3.2, 29/100}, {3.3,
29/100}, {3.4, 27/100}, {3.5, 13/50}, {3.6, 6/25}, {3.7,
6/25}, {3.8, 6/25}, {3.9, 6/25}, {4., 6/25}, {4.1, 21/100}, {4.2,
1/5}, {4.3, 1/5}, {4.4, 19/100}, {4.5, 9/50}, {4.6, 9/50}, {4.7,
4/25}, {4.8, 4/25}, {4.9, 4/25}, {5., 4/25}};


which I plot using ListPlot

Needs["PlotLegends"]
a = ListPlot[{plotgamma6, plotgamma10}, AxesOrigin -> {0, 0},
PlotRange -> {{0, 5}, {0, 1}}, AxesLabel -> {"gamma", "quantity"},
PlotStyle -> PointSize[0.02], PlotLegend -> {"N=6", "N=10",},
LegendPosition -> {1.1, -0.4}, Joined -> {True, True},
PlotMarkers -> Automatic]


Now, I also want to plot a function which needs to be compared with the above data, i.e.,

    f[z_] := Exp[-z/2] BesselI[0, z/2];
b = Plot[-2 f'[z], {z, 0, 5}, PlotLegend -> "Theory",
LegendPosition -> {1.1, -0.4}]


Now, I want to combine these two plots into one, so I use

Show[a,b]


However, this gives a messed up plot! If I remove the plot legends from both the plots, then the combined plot looks reasonable though. But I really want to retain the plot legends. How would you combine these two plots? It doesn't matter to me how you plot these data, i.e., if you use Show or some other function.

Please note that my question is closely related to How to show legend in a combined plot of many lists,

However, that question wasn't answered fully either.

Thanks! dbm368

-
What Mathematica version are You working on? – Kuba Jul 5 '13 at 19:08
I am using Mathematica 7. Thanks. – dbm Jul 5 '13 at 19:09

The plots are misaligned because plot b doesn't have the exact same options as a, which causes it to be drawn slightly different. If you give the same options to plot b (PlotRange, AxesOrigin, and AxesLabel)

b = Plot[-2 f'[z], {z, 0, 5}, PlotLegend -> "Theory",
PlotRange -> {{0, 5}, {0, 1}}, LegendPosition -> {1.1, -0.4},
AxesOrigin -> {0, 0}, AxesLabel -> {"gamma", "quantity"}]


then you can use Show[a,b] to get them lined up:

Note that you'll have to move the "Theory" legend to get the "N=10" legend to show.

Alternatively, you could generate a set of data from the theoretical functions, and plot that in one go with your other data:

plottheory = Table[{z, -2 f'[z]}, {z, 0, 5, 0.01}];

ListPlot[
{plotgamma6, plotgamma10, plottheory},
AxesOrigin->{0,0}, PlotRange->{{0,5},{0,1}}, AxesLabel->{"gamma","quantity"},
PlotStyle->PointSize[0.02], PlotLegend-> {"N=6","N=10","theory"},
LegendPosition->{1.1,-0.4}, Joined->True,
PlotMarkers->{\[FilledSmallSquare],\[FilledSmallCircle],""}
]


This gives a slightly nicer output:

-

You can also handle this legending problem with the functions I defined (and just updated) in this answer. You have to copy all the definitions in the first code block of that answer, and then do this:

a = ListPlot[{plotgamma6, plotgamma10}, AxesOrigin -> {0, 0},
PlotRange -> {{0, 5}, {0, 1}}, AxesLabel -> {"gamma", "quantity"},
PlotStyle -> PointSize[0.02],
Joined -> {True, True}, PlotMarkers -> Automatic];

f[z_] := Exp[-z/2] BesselI[0, z/2];
b = Plot[-2 f'[z], {z, 0, 5}];

c = Show[a, b];

styles = extractStyles[c]


{{Directive[Hue[0.67,0.6,0.6],PointSize[0.02]],Directive[Hue[0.906068,0.6,0.6],PointSize[0.02]],Directive[Hue[0.67,0.6,0.6]]},{\[FilledCircle],\[FilledSquare]}}

The above output is a list whose first element contains the styles of the three different lines in c, and whose second element is a list of plot markers. The latter has only two members, {\[FilledCircle],\[FilledSquare]}. I now want to use this information in the function legendMaker of the linked answer, but for this I need to add an invisible "dummy" plot marker so that I can pass three line styles and three plot markers to the function:

Overlay[{c, legendMaker[{"N=6", "N=10", "Theory"},
PlotStyle -> styles[[1]],
PlotMarkers -> Append[
styles[[2]], ""]]}, Alignment -> {Right, Top}]


-
Nice explanation in both answers and nice trick of adding a dummy plot marker! – Leo Fang Jul 15 '13 at 3:25
@LeoFang Thanks for pointing this question out to me earlier... even if my solution isn't fully automatic, at least it looks more modern than the old PlotLegends` package. – Jens Jul 15 '13 at 3:36
it's way more modern! – Leo Fang Jul 15 '13 at 4:07