Визуализация данных: как сделать специальный 2D-график из 3 столбцов данных?

405
alchemist

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

plot

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

0
Я не уверен, что могу прочитать этот сюжет. Это выглядит как y = f (x1, y2) с энергией y, расстоянием x1 и углом x2, нанесенным с вектором наблюдения, параллельным оси x2 и кодированным цветом x2. Это правильно? Тогда gnuplot может сделать это с помощью splot и установить правильный угол обзора. Joce 7 лет назад 0

1 ответ на вопрос

0
g.kov

Рассмотрим асимптоту . Это бесплатный, открытый исходный код, мультиплатформенный, использует C++подобный язык для описания векторной графики и обработки данных, а также взаимодействует LaTeXдля визуализации текстовых меток. Он включен в более-менее LaTeXраспространенные дистрибутивы (например TexLive).

Например, этот рисунок является попыткой смоделировать рассматриваемую картинку (функции являются произвольными, просто чтобы получить немного похожий вид):

enter image description here

Было сгенерировано 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\usepackage[free-standing-units=true]");  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)  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), palLabelValue.length ), sequence(new real(int n), palLabelValue.length ), tr );  label(rotate(90)*("Angle (\degree)"),shift(-1,0)*tr*(0,-1),plain.W);  shipout(bbox(Fill(paleyellow)));