Graphics commands

fishp = {{0.2028,0.6056},{0.2639,0.5333},{0.4083,0.4694},{0.5222,0.5139},{0.5194,0.5611},{0.4139,0.6194},{0.2111,0.4472}};
fishc = {Min@fishp[[All,1]],Min@fishp[[All,2]]};
fishp = #-fishc& /@ fishp;
fishw = 1/Max@fishp[[All,1]];
fishp = fishw fishp;
fish = Graphics[{
Polygon@Table[BSplineFunction[fishp][t],{t,0,1,.01}],
FaceForm[{White,Opacity[.8]}],
Disk[fishw({0.4389,0.56}-fishc),.01 fishw]
},
PlotRange->{{Min@fishp[[All,1]],Max@fishp[[All,1]]},{Min@fishp[[All,2]],Max@fishp[[All,2]]}}]

fishwidth = (PlotRange /. Options@fish)[[1,2]];
fishheight = (PlotRange /. Options@fish)[[2,2]];

boxwidth = 150;
boxheight=150;

RExp[n_,λ_:1] := Table[Random[ExponentialDistribution[λ]],{n}]

RPareto[n_,α_,m_:1] := Table[Random[ParetoDistribution[m(1-1/α),α]],{n}]

RUnif[n_,m_:0,M_:1]:=Table[Random[UniformDistribution[{m,M}]],{n}]

fishcol[x_] := Opacity[1-.6Min[(x/(2 meanwidth)),1],Hue[ColorConvert[ColorData["ThermometerColors"][.4(((x-meanwidth)/meanwidth)+.5)],"HSB"][[1]]]]

drawfish[size_,dir_] := Inset[Graphics@{FaceForm[{fishcol[size]}],fish[[1]]},{RUnif[1][[1]](boxwidth-size fishwidth) -((dir-1)/2)size fishwidth,RUnif[1][[1]](boxheight-size fishheight)},{0,0},size,{{dir,0},{0,1}}]

FishTank[sizes_] := Graphics[{
{FaceForm[None],EdgeForm[Black],Rectangle[{0,0},{boxwidth,boxheight}]},
drawfish[(Sqrt[#]),RandomChoice[{-1,1}]]& /@ sizes},
PlotRange->{{-.05 boxwidth,1.05 boxwidth},{-.05 boxheight,1.05 boxheight}}]

Demo

nfish = 18;
ntrials = 6;
meanwidth =40;
samp[] := {Table[RExp[nfish],{ntrials}],Table[RPareto[nfish,1.1],{ntrials}],Table[RPareto[nfish,5],{ntrials}]};
sizes = {{RExp[nfish]}};
Row@{
Button["Exp(1)",sizes={{RExp[nfish]}}],
Button["Pareto(1.1)",sizes={{RPareto[nfish,1.1]}}],
Button["Pareto(5)",sizes={{RPareto[nfish,5]}}],
Button["many",sizes=samp[]]}

Dynamic[GraphicsGrid[Map[FishTank,(meanwidth^2)sizes,{2}],ImageSize->Large,Spacings->0],TrackedSymbols:>{sizes},SynchronousUpdating->False]