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.

This is the sets of data I want to put into a form which will allow me to plot error bars from the min and max data.

avg = {{10, 0.662}, {20, 0.96}, {30, 0.916}, {40, 0.787}, {50,0.621}, {60, 0.453}}
min = {{0.55`}, {0.91`}, {0.85`}, {0.72`}, {0.58`}, {0.42`}}
max = {{0.76`}, {1.02`}, {0.99`}, {0.85`}, {0.68`}, {0.51`}}

This following code worked with n=1, creating one point on the graph. How do I make it loop to n=Length[avg] to plot all the points?

errmin = min[[n]] - avg[[n, 2]]
errmax = max[[n]] - avg[[n, 2]]
err = Flatten[{errmin, errmax}]
data = {{avg[[n]], ErrorBar[err]}}

ylabel = "Voltage (V \[PlusMinus] 0.05)"
xlabel = "Blade Angle (\[Degree] \[PlusMinus] 3)"
title = "Preliminary - Altering Blade Angle"
Needs["ErrorBarPlots`"]
ErrorListPlot[data, Joined -> True, InterpolationOrder -> 2, 
 Mesh -> Full, PlotMarkers -> Automatic, 
 AxesLabel -> {xlabel, ylabel}, GridLines -> Automatic, 
 GridLinesStyle -> Dotted, PlotLabel -> Style[title, Bold], 
 LabelStyle -> (FontFamily -> "Helvetica")]

I should point out I'm new to Mathematica today so please don't be too technical.

share|improve this question

2 Answers 2

up vote 6 down vote accepted

What you are looking for is MapThread. Specifically, I would generate your data using this code

data = MapThread[
        {#1, ErrorBar[{#2[[1]] - #1[[2]], #3[[1]] - #1[[2]]}]} &, 
        {avg, min, max}
]

which when input into your ErrorListPlot you get

enter image description here

Note, I added the option PlotRange -> All as it was getting cut off.


Now to explain the code. MapThread pulls a single element out of each list passed to it (the second parameter), and applies a function to them (the first parameter). In this case, the function is

{#1, ErrorBar[{#2[[1]] - #1[[2]], #3[[1]] - #1[[2]]}]} &

Here the #n terms (called Slots) refer to the parameters passed by number, so #1 is from avg, etc. The & at the end tells Mathematica that it is a pure function.

share|improve this answer
    
Ah that's brilliant, thank you! –  Theo Windebank Oct 27 '12 at 19:28
    
@TheoWindebank you're welcome. Don't forget to vote for good answers, and to accept the one that is the most helpful. –  rcollyer Oct 27 '12 at 19:30
    
@TheoWindebank you should also look closely at s0rce's answer as it talks a bit about vector operations which will simplify your life. –  rcollyer Oct 27 '12 at 19:34
    
Say now I have multiple sets of data, can I use a similar method to make multiple graphs without just copying the code over and over? –  Theo Windebank Oct 27 '12 at 20:10
    
@TheoWindebank I'm not sure what you mean. You can turn it into a function, or I'd do this: ErrorListPlot[MapThread[..., #], ...]& /@ {{avg, min, max}, ...} where the ellipses are filled in as appropriate. –  rcollyer Oct 27 '12 at 20:43
avg = {{10, 0.662}, {20, 0.96}, {30, 0.916}, {40, 0.787}, {50, 
   0.621}, {60, 0.453}}
min = {{0.55`}, {0.91`}, {0.85`}, {0.72`}, {0.58`}, {0.42`}}
max = {{0.76`}, {1.02`}, {0.99`}, {0.85`}, {0.68`}, {0.51`}}

You can perform subtraction on the whole list

errmin = min[[All, 1]] - avg[[All, 2]];
errmax = max[[All, 1]] - avg[[All, 2]];

combine the errmin and errmax

error = Transpose[{errmin, errmax}];

combine data and error

dataerror = MapThread[{#1, ErrorBar[#2]} &, {avg, error}];

now plot it all

ErrorListPlot[dataerror, 
 Joined -> True, InterpolationOrder -> 2, Mesh -> Full, 
 PlotMarkers -> Automatic, AxesLabel -> {xlabel, ylabel}, 
 GridLines -> Automatic, GridLinesStyle -> Dotted, 
 PlotLabel -> Style[title, Bold], 
 LabelStyle -> (FontFamily -> "Helvetica")]

Mathematica graphics

share|improve this answer

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.