Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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

share|improve this question
    
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

2 Answers 2

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: output of Show[a,b]

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:

output of ListPlot[{},...]

share|improve this answer

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

plot with and w/o markers

share|improve this answer
    
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

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.