Недавно я нашел следующий сюжет:
и мне любопытно, можно ли что-то подобное сделать, например, с помощью Gnuplot (или другого программного обеспечения)? У меня есть данные в трех столбцах, то есть энергия угла расстояния. У кого-нибудь есть идеи?
Недавно я нашел следующий сюжет:
и мне любопытно, можно ли что-то подобное сделать, например, с помощью Gnuplot (или другого программного обеспечения)? У меня есть данные в трех столбцах, то есть энергия угла расстояния. У кого-нибудь есть идеи?
Рассмотрим асимптоту.
Он бесплатный, с открытым исходным кодом, мультиплатформенный, использует 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{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)));