// dot plot for single data dotPlot := proc(data, xmin, xmax) local fr, pt, pts; begin data:=sort(data): fr := 1: pt := [data[1],fr]: pts := [pt]: for i from 2 to nops(data) do if data[i]<>data[i-1] then fr := 1 else fr := fr+1 end_if: pt := [data[i],fr]: pts := pts.[pt] end_for: PL:=plot::PointList2d(pts, PointColor=RGB::Olive, GridVisible=TRUE, XSubgridVisible=TRUE, PointStyle=FilledDiamonds, YTicksAnchor=0, ViewingBoxXMin=xmin, ViewingBoxXMax=xmax, ViewingBoxYMin=0 ): return(PL) end_proc: // dot plot for double data dotPlotDouble := proc(data1, data2, xmin, xmax) local fr, pt, pts; begin data1:=sort(data1): fr := 1: pt := [data1[1],fr]: pts := [pt]: for i from 2 to nops(data1) do if data1[i]<>data1[i-1] then fr := 1 else fr := fr+1 end_if: pt := [data1[i],fr]: pts := pts.[pt] end_for: PL:=plot::PointList2d(pts, PointColor=RGB::Olive, GridVisible=TRUE, XSubgridVisible=TRUE, PointStyle=FilledDiamonds, YTicksAnchor=0, ViewingBoxXMin=xmin, ViewingBoxXMax=xmax ): // second set of points data2:=sort(data2): fr := -1: pt := [data2[1],fr]: pts2 := [pt]: for i from 2 to nops(data2) do if data2[i]<>data2[i-1] then fr := 1 else fr := fr+1 end_if: pt := [data2[i],-fr]: pts2 := pts2.[pt] end_for: PL2:=plot::PointList2d(pts2, PointColor=RGB::Orange, GridVisible=TRUE, XSubgridVisible=TRUE, PointStyle=FilledDiamonds, YTicksAnchor=0, ViewingBoxXMin=xmin, ViewingBoxXMax=xmax ): return(plot::Group2d(PL,PL2)) end_proc: cumFreq := proc(data, cells) local FT; begin FT := stats::frequency(data,Cells=cells): startPoint:=[FT[1][1][1],0]: pts := [startPoint]: sumOfFreq := 0: for i from 1 to nops(FT) do sumOfFreq := sumOfFreq + FT[i][2]: nextPoint := [FT[i][1][2],sumOfFreq]: pts := pts.[nextPoint] end: // nextPoint:=[nextPoint[1],0]: // pts := pts.[nextPoint]: plot::Polygon2d(pts, PointSize=2, PointsVisible=TRUE, GridVisible=TRUE, // Closed=TRUE, // Filled=TRUE, // FillPattern=FDiagonalLines, LineColor=RGB::Olive, FillColor=RGB::Green ) end: // pareto diagram pareto:=proc(data) begin data:=sort(data, (x,y)->(x[2]>y[2])): numbers:=[data[i][2] $ i=1..nops(data)]: names := [cleandata(data[i][1]) $ i=1..nops(data)]: bars:=plot::Bars2d(numbers, Colors=[RGB::Olive]): sumOfFreq := 0: pts:=[]: for i from 1 to nops(data) do sumOfFreq := sumOfFreq + data[i][2]: nextPoint := [i-1,sumOfFreq]: pts := pts.[nextPoint] end: line:=plot::Polygon2d(pts, PointsVisible=TRUE, PointSize=2.5, LineColor=RGB::Orange ): labels := (plot::Text2d(names[i],[i-1,-1], HorizontalAlignment=Left, TextRotation=-PI/3)) $ i=1..nops(data): plot::Group2d(bars,line, labels, XTicksLabelsVisible=FALSE, XTicksVisible=FALSE, XGridVisible=TRUE, ViewingBoxYMin=0, Axes=Boxed ) end: // quantile output quantile := proc(dat, base, nr) begin if nr >= base then return("wrong input, base < nr") end_if: dat := sort(dat): n := nops(dat): check := n*nr/base: if domtype(check)=DOM_INT then return((dat[check]+dat[check+1])/2) else return(dat[ceil(check)]) end end_proc: cleandata := proc(data) begin if domtype(data)=DOM_IDENT then return(expr2text(data)) else return(data) end_if end: