Visualização de dados: como fazer um gráfico 2D especial a partir de 3 colunas de dados?

0

Recentemente, encontrei o seguinte enredo:

e estou curioso para saber se algo assim pode ser feito, por exemplo, Gnuplot (ou outro software)? Eu tenho dados em três colunas, ou seja, energia do ângulo de distância. Alguém tem alguma ideia?

    
por alchemist 11.04.2017 / 22:54

1 resposta

0

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):

FoigeradopeloAsymptotecode

////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)));
    
por 12.04.2017 / 13:47