Considere as Asymptote .
É grátis, código aberto, multiplataforma
usa a linguagem C++
-like para descrever gráficos vetoriais e manipular dados,
e coopera com LaTeX
para renderizar rótulos de texto.
Está incluído nas distribuições LaTeX
mais ou menos atualizadas (por exemplo, TexLive
).
Por exemplo, essa figura é uma tentativa de simular a imagem em questão (funções são arbitrárias, apenas para obter uma aparência um pouco semelhante):
FoigeradopeloAsymptote
code
////plotfigure.asy////run//asyplotfigure.asy//togetplotfigure.pdfsettings.tex="pdflatex";
import graph;
import palette;
real w=9cm,h=w;
size(w,h,IgnoreAspect);
import fontsize;defaultpen(fontsize(9pt));
texpreamble("\usepackage{lmodern}\usepackage[free-standing-units=true]{siunitx}");
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){return "";}
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){return string(palLabelValue[n]);}, palLabelValue.length ),
sequence(new real(int n){return labPosCalc(palLabelValue[n]);}, palLabelValue.length ),
tr
);
label(rotate(90)*("Angle (\degree)"),shift(-1,0)*tr*(0,-1),plain.W);
shipout(bbox(Fill(paleyellow)));