Рассмотрим асимптоту . Это бесплатный, открытый исходный код, мультиплатформенный, использует C++
подобный язык для описания векторной графики и обработки данных, а также взаимодействует LaTeX
для визуализации текстовых меток. Он включен в более-менее LaTeX
распространенные дистрибутивы (например TexLive
).
Например, этот рисунок является попыткой смоделировать рассматриваемую картинку (функции являются произвольными, просто чтобы получить немного похожий вид):
Было сгенерировано Asymptote
кодом
// // plotfigure.asy // // run // asy plotfigure.asy // to get plotfigure.pdf settings.tex="pdflatex"; import graph; import palette; real w=9cm,h=w; size(w,h,IgnoreAspect); import fontsize;defaultpen(fontsize(9pt)); texpreamble("\usepackage\usepackage[free-standing-units=true]"); real xmin=-2,xmax=7; real ymin=-22,ymax=0; real dxmin=0.2; real dxmax=0.4; real dymin=0; real dymax=0; string NoLabel(real x) typedef real realFuncReal(real); realFuncReal f(real z){ return new real(real t){ real x=t*0.6; return 10*z*(-exp(-x^2)-2*exp(-(x-2.2)^2)); }; } real phiMin=-5.7, phiMax=171.9; int n=2000; //int n=100; pen[] pal=Wheel(n);// BWRainbow(n); n=pal.length; real t; for(int i=0;i<n;++i){ t=i/(n-1); draw(graph(f(t),xmin,xmax),pal[i]); } void PaletteBar(pen[] pal,transform tr=identity()){ guide bar=box((-1,-1),(1,1)); int n=pal.length-1; for(int i=0;i<n;++i){ axialshade(tr*box((-1,-1)+(2*i/n,0),(-1,-1)+(2*(i+1)/n,2)) ,pal[i ], (-1,-1)+(2*i/n, 0) ,pal[i+1], (-1,-1)+(2*(i+1)/n,0) ); } } void PaletteLabels(string[] lab,real[] labRelPos,transform tr=identity()){ int n=lab.length; assert(n==labRelPos.length); for(int i=0;i<n;++i){ label(lab[i],tr*(-1+2*labRelPos[i],-1), shiftless(tr)*plain.S); } } xaxis("Distance (\angstrom)", YEquals(ymin),xmin-dxmin,xmax+dxmax,RightTicks(Step=1,step=0.5 )); xaxis(YEquals(ymax),xmin-dxmin,xmax+dxmax,LeftTicks(Step=1,step=0.5,ticklabel=NoLabel )); yaxis("Free Energy (kkal/mol)" ,XEquals(xmin-dxmin),ymin-dymin,ymax+dymax,LeftTicks (Step=2,step=1) ); yaxis( XEquals(xmax+dxmax),ymin-dymin,ymax+dymax,RightTicks (Step=2,step=1,ticklabel=NoLabel) ); transform tr=shift(1,-16)*rotate(-90)*scale(2,0.25); PaletteBar(pal,tr); real labPosCalc(real labVal){ return (labVal-phiMin)/(phiMax-phiMin); } real[] palLabelValue={-5.7,83.1,171.9}; PaletteLabels( sequence(new string(int n), palLabelValue.length ), sequence(new real(int n), palLabelValue.length ), tr ); label(rotate(90)*("Angle (\degree)"),shift(-1,0)*tr*(0,-1),plain.W); shipout(bbox(Fill(paleyellow)));