Недавно я нашел следующий сюжет:

сюжет

и мне любопытно, можно ли что-то подобное сделать, например, с помощью Gnuplot (или другого программного обеспечения)? У меня есть данные в трех столбцах, то есть энергия угла расстояния. У кого-нибудь есть идеи?

1 ответ1

0

Рассмотрим асимптоту. Он бесплатный, с открытым исходным кодом, мультиплатформенный, использует 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)));

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .