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

0

Recentemente eu encontrei o seguinte enredo:

plot

e estou curioso para saber se algo assim pode ser feito com, 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?

alchemist
fonte
Não tenho certeza se posso ler este enredo. Parece y = f (x1, y2) com energia y, distância x1 e ângulo x2, plotados com um vetor de visualização paralelo ao eixo x2 e código de cores x2. Isso esta certo? Então o gnuplot pode fazer isso com splot e ajustar o ângulo de visão correto.
Joce

Respostas:

0

Considerar Assíntota . É grátis, código aberto, multiplataforma usa C++ semelhante à linguagem para descrever gráficos vetoriais e lidar com dados, e coopera com LaTeX para renderizar etiquetas de texto. Está incluído no mais ou menos ressentido LaTeX distribuições (por ex. TexLive ).

Por exemplo, esta 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):

enter image description here

Foi gerado pelo Asymptote código

//
// 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)));
g.kov
fonte