SimplePlotter[thisNamesForDataColumns_,thisData_] := Manipulate[
(* the first set of commands is: figure out which columns from the data the user wants to plot *)
choicex = Position[thisNamesForDataColumns,choicexname][[1]][[1]];
choicey = Position[thisNamesForDataColumns,choiceyname][[1]][[1]];
(* we then put that into a new array using the "Table" command *)
choicecut = Flatten[Position[thisNamesForDataColumns,choicecutname]][[1]];

(* I take the user's cut-variable, if any, and apply it, throwing away data where the cut variable is outside the range *)
If[UseCut,
SelectedData = Select[thisData,#[[choicecut]] > cutmin && #[[choicecut]] < cutmax &],
SelectedData = thisData
]
;
plotdata = Table[{SelectedData[[i]][[choicex]],SelectedData[[i]][[choicey]]},{i,1,Length[SelectedData]}];
(* ... and we plot that data table. *)
mylistplot = ListPlot[plotdata,PlotMarkers->{Automatic,Medium},AxesLabel->{choicexname,choiceyname}];

(*The next set of commands are figuring out if the user wanted to draw a function of some sort *)
If[UseEquation,
mygraph = Plot[ToExpression[userequation],{x,Min[plotdata[[All,1]]],Max[plotdata[[All,1]]]}];
Show[mylistplot,mygraph],
Show[mylistplot]]
,
(* a bunch of definitions of controls *)
{{choicexname,thisNamesForDataColumns[[1]],"x-axis"},thisNamesForDataColumns},
{{choiceyname,thisNamesForDataColumns[[2]],"y-axis"},thisNamesForDataColumns},
{{UseEquation,False,"Plot an equation?"},{False,True}},
{userequation,"x*25 + 0.001","plot y="},
{{UseCut,False,"Restrict the data?"},{False,True}},
{{choicecutname,thisNamesForDataColumns[[1]],"restricted variable"},thisNamesForDataColumns},
{{cutmin,5,"from min= "},-10000,10000},
{{cutmax,10000,"to max="},-10000,10000},ControlType->{PopupMenu,PopupMenu,Checkbox,InputField,Checkbox,PopupMenu,InputField,InputField}
]

FlexibleHistogrammer[thisNamesForHistogramData_,thishistogramdata_] := Manipulate[
(* to begin with are some boring data-format manipulations *)
If[Length[thishistogramdata[[1]]] >1,
DataIn2D = thishistogramdata,
DataIn2D = Table[{thishistogramdata[[i]]},{i,1,Length[thishistogramdata]}]
]

choicex = Flatten[Position[thisNamesForHistogramData,choicexname]][[1]];
choicecut = Flatten[Position[thisNamesForHistogramData,choicecutname]][[1]];

(* I take the user's cut-variable, if any, and apply it, throwing away data where the cut variable is outside the range *)
SelectedData = Select[DataIn2D,#[[choicecut]] > cutmin && #[[choicecut]] < cutmax &];
DataToHistogram = SelectedData[[All,choicex]];
(* finally I make a histogram of the data *)
Show[
Histogram[DataToHistogram,{width},AxesLabel->{choicexname,StringJoin["counts per ",ToString[width], "-unit bin"]}],
Graphics[Text[StringJoin["mean = ",ToString[N[Mean[DataToHistogram]]]],Scaled[{0.8,0.99}]]],
Graphics[Text[StringJoin["stdev = ",ToString[N[StandardDeviation[DataToHistogram]]]],Scaled[{0.8,0.94}]]]
]

,
{{choicexname,thisNamesForHistogramData[[1]],"variable"},thisNamesForHistogramData},
{{width,5,"bin width"},0.1,10},
{{choicecutname,thisNamesForHistogramData[[1]],"with cut on"},thisNamesForHistogramData},
{{cutmin,5,"from min= "},-10000,10000},
{{cutmax,10000,"to max="},-10000,10000},

ControlType->{PopupMenu,InputField,PopupMenu,InputField,InputField}
]

Physics 128 Multi-Variable Notebook
This notebook will allow you to type in the more complicated data.  I have supplied sample data from an (imaginary) experiment calibrating a 100-ohm resistor.     Run this notebook (Evaluation menu --> "Evaluate Notebook") to see, and manipulate, a plot of this data, and see if Ohm's Law holds.

Note the new format for 2-D data: it is a "table" or "matrix".    When you typed a simple list of measurements, you put the whole list in curly-brackets {} and separated items with commas.   If each measurement is itself a list of numbers---maybe one measurement has a time, a voltage, and a current---you make the measurement into a mini-list.   The set of measurements is a list of mini-lists, with commas between them and brackets around the lot.   Look at my example dataset to see how this works, then enter your own data in the same format.

NamesOfDataElements = {"time", "voltage", "current", "comments"}

DataInMatrixForm = {  
{10.02, 0.5, 0.00495, 0}, 
        {10.03, 1., 0.01013, 0},
{10.04, 2., 0.0201, 0},
 {10.05, 2.5, 0., "ammeter jumping around"}, 
 {10.1, 2.5, 0.0251, "better this time"}, 
 {10.11, 5, 0.0498, 0}, 
       {10.12, 10, 0.0996, 0},
{10.13, 10, 0.101, 0}    }
   
SimplePlotter[NamesOfDataElements, DataInMatrixForm]

Some more manipulation of this data
Next, perhaps you want to manipulate the data in order to calculate the resistance.   Work through this with me.   First, I want to take each data point and calculate R = V/I.  Let me try to get an array of all of the voltages, by itself.  It is column number 2 of the array.   Look at the syntax for pulling out one whole column :
   voltage = DataInGridForm[[All,2]]
   current = DataInGridForm[[All,3]]
Type or copy this into a new cell and see if the results make sense.   This should print out an array (which Mathematica will remember, under the name "voltage", until you tell it otherwise or quit the program.)   
	Mathematica is pretty good at dealing with whole arrays of data.   If you had one V and one I, you'd say R = V/I.   It turns out you can do the same thing with a whole array.   Type this:
     resistance = voltage/current
	That will run, but it will also beep and pop up an error window.  One of the currents---the mismeasured one---was zero, so one of the resistances calculates out to infinity.   Look, it's measurement #4, which we had flagged as worrisome.   It's time to reorganize the data a bit to throw out this point.  The first three points are OK, so we can grab them on their own:
 	resistanceFirstSet = voltage[[1;;3]] / current[[1;;3]]
The last four points (points 5-8) are also good, let's grab those:
 	resistanceSecondSet = voltage[[5;;8]] / current[[5;;8]]
 Good, now we have two arrays containing just the "good" resistor voltage and current measurements.   Let's patch them together.  Type this: 
	 resistanceAll = Join[resistanceFirstSet,resistanceSecondSet]

Fitting A Theory Curve To Your Data
One of the key operations you will do with data is to perform fits.   You can read more about fitting in your textbook.   To make Mathematica do fits properly, I will show you some of the data-manipulations you may need.   First, "SimpleFitter" is a tool somewhat like "SimplePlotter".   For any data

SimpleFitter[thisNamesForDataColumns_,thisData_] := 
Manipulate[
choicex = Position[thisNamesForDataColumns,choicexname][[1]][[1]];
choicey = Position[thisNamesForDataColumns,choiceyname][[1]][[1]];
(* we then put that into a new array using the "Table" command *)
choicecut = Flatten[Position[thisNamesForDataColumns,choicecutname]][[1]];

(* I take the user's cut-variable, if any, and apply it, throwing away data where the cut variable is outside the range *)
If[UseCut,
SelectedData = Select[thisData,#[[choicecut]] > cutmin && #[[choicecut]] < cutmax &],
SelectedData = thisData
]
;
plotdata = Table[{SelectedData[[i]][[choicex]],SelectedData[[i]][[choicey]]},{i,1,Length[SelectedData]}];

myFit = NonlinearModelFit[plotdata,ToExpression[userEquation],ToExpression[userVariables],x];
GraphicsGrid[{{ Show[
Plot[myFit["BestFit"],{x,0,0.1}],
ListPlot[plotdata,PlotMarkers->{Automatic,Medium}]
]},{Text[myFit["ParameterTable"]]}}
],
{{choicexname,thisNamesForDataColumns[[1]],"x-axis"},thisNamesForDataColumns},
{{choiceyname,thisNamesForDataColumns[[2]],"y-axis"},thisNamesForDataColumns},
{{userEquation,"a*x + b","fit to y="}},
{{userVariables,"{a,b}","with parameters "}},
{{UseCut,False,"Restrict the data?"},{False,True}},
{{choicecutname,thisNamesForDataColumns[[1]],"restricted variable"},thisNamesForDataColumns},
{{cutmin,5,"from min= "},-10000,10000},
{{cutmax,10000,"to max="},-10000,10000},


ControlType->{PopupMenu,PopupMenu,InputField,InputField,Checkbox,PopupMenu,InputField,InputField}
]

NamesOfDataElements = {"time", "voltage", "current", "comments"}

DataInMatrixForm = {  
{10.02, 0.5, 0.00495, 0}, 
        {10.03, 1., 0.01013, 0},
{10.04, 2., 0.0201, 0},
 {10.05, 2.5, 0., "ammeter jumping around"}, 
 {10.1, 2.5, 0.0251, "better this time"}, 
 {10.11, 5, 0.0498, 0}, 
       {10.12, 10, 0.0996, 0},
{10.13, 10, 0.101, 0}    }

SimpleFitter[NamesOfDataElements,DataInMatrixForm]