3D 统计数字

3D 统计数字

我想知道哪种软件(例如 MetaPost、TikZ 等)最适合用于重现下面粘贴的图。该示例取自新数据挖掘(第 205 页)。

在此处输入图片描述

答案1

在此处输入图片描述

这是原始基础的图片,采用 Asymptote矢量格式制作。

% iris3d.tex :
%
%% database iris.data from 
%% http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
%
\begin{filecontents*}{iris.data}
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.4,3.7,1.5,0.2,Iris-setosa
4.8,3.4,1.6,0.2,Iris-setosa
4.8,3.0,1.4,0.1,Iris-setosa
4.3,3.0,1.1,0.1,Iris-setosa
5.8,4.0,1.2,0.2,Iris-setosa
5.7,4.4,1.5,0.4,Iris-setosa
5.4,3.9,1.3,0.4,Iris-setosa
5.1,3.5,1.4,0.3,Iris-setosa
5.7,3.8,1.7,0.3,Iris-setosa
5.1,3.8,1.5,0.3,Iris-setosa
5.4,3.4,1.7,0.2,Iris-setosa
5.1,3.7,1.5,0.4,Iris-setosa
4.6,3.6,1.0,0.2,Iris-setosa
5.1,3.3,1.7,0.5,Iris-setosa
4.8,3.4,1.9,0.2,Iris-setosa
5.0,3.0,1.6,0.2,Iris-setosa
5.0,3.4,1.6,0.4,Iris-setosa
5.2,3.5,1.5,0.2,Iris-setosa
5.2,3.4,1.4,0.2,Iris-setosa
4.7,3.2,1.6,0.2,Iris-setosa
4.8,3.1,1.6,0.2,Iris-setosa
5.4,3.4,1.5,0.4,Iris-setosa
5.2,4.1,1.5,0.1,Iris-setosa
5.5,4.2,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.0,3.2,1.2,0.2,Iris-setosa
5.5,3.5,1.3,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
4.4,3.0,1.3,0.2,Iris-setosa
5.1,3.4,1.5,0.2,Iris-setosa
5.0,3.5,1.3,0.3,Iris-setosa
4.5,2.3,1.3,0.3,Iris-setosa
4.4,3.2,1.3,0.2,Iris-setosa
5.0,3.5,1.6,0.6,Iris-setosa
5.1,3.8,1.9,0.4,Iris-setosa
4.8,3.0,1.4,0.3,Iris-setosa
5.1,3.8,1.6,0.2,Iris-setosa
4.6,3.2,1.4,0.2,Iris-setosa
5.3,3.7,1.5,0.2,Iris-setosa
5.0,3.3,1.4,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
5.5,2.3,4.0,1.3,Iris-versicolor
6.5,2.8,4.6,1.5,Iris-versicolor
5.7,2.8,4.5,1.3,Iris-versicolor
6.3,3.3,4.7,1.6,Iris-versicolor
4.9,2.4,3.3,1.0,Iris-versicolor
6.6,2.9,4.6,1.3,Iris-versicolor
5.2,2.7,3.9,1.4,Iris-versicolor
5.0,2.0,3.5,1.0,Iris-versicolor
5.9,3.0,4.2,1.5,Iris-versicolor
6.0,2.2,4.0,1.0,Iris-versicolor
6.1,2.9,4.7,1.4,Iris-versicolor
5.6,2.9,3.6,1.3,Iris-versicolor
6.7,3.1,4.4,1.4,Iris-versicolor
5.6,3.0,4.5,1.5,Iris-versicolor
5.8,2.7,4.1,1.0,Iris-versicolor
6.2,2.2,4.5,1.5,Iris-versicolor
5.6,2.5,3.9,1.1,Iris-versicolor
5.9,3.2,4.8,1.8,Iris-versicolor
6.1,2.8,4.0,1.3,Iris-versicolor
6.3,2.5,4.9,1.5,Iris-versicolor
6.1,2.8,4.7,1.2,Iris-versicolor
6.4,2.9,4.3,1.3,Iris-versicolor
6.6,3.0,4.4,1.4,Iris-versicolor
6.8,2.8,4.8,1.4,Iris-versicolor
6.7,3.0,5.0,1.7,Iris-versicolor
6.0,2.9,4.5,1.5,Iris-versicolor
5.7,2.6,3.5,1.0,Iris-versicolor
5.5,2.4,3.8,1.1,Iris-versicolor
5.5,2.4,3.7,1.0,Iris-versicolor
5.8,2.7,3.9,1.2,Iris-versicolor
6.0,2.7,5.1,1.6,Iris-versicolor
5.4,3.0,4.5,1.5,Iris-versicolor
6.0,3.4,4.5,1.6,Iris-versicolor
6.7,3.1,4.7,1.5,Iris-versicolor
6.3,2.3,4.4,1.3,Iris-versicolor
5.6,3.0,4.1,1.3,Iris-versicolor
5.5,2.5,4.0,1.3,Iris-versicolor
5.5,2.6,4.4,1.2,Iris-versicolor
6.1,3.0,4.6,1.4,Iris-versicolor
5.8,2.6,4.0,1.2,Iris-versicolor
5.0,2.3,3.3,1.0,Iris-versicolor
5.6,2.7,4.2,1.3,Iris-versicolor
5.7,3.0,4.2,1.2,Iris-versicolor
5.7,2.9,4.2,1.3,Iris-versicolor
6.2,2.9,4.3,1.3,Iris-versicolor
5.1,2.5,3.0,1.1,Iris-versicolor
5.7,2.8,4.1,1.3,Iris-versicolor
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
6.5,3.0,5.8,2.2,Iris-virginica
7.6,3.0,6.6,2.1,Iris-virginica
4.9,2.5,4.5,1.7,Iris-virginica
7.3,2.9,6.3,1.8,Iris-virginica
6.7,2.5,5.8,1.8,Iris-virginica
7.2,3.6,6.1,2.5,Iris-virginica
6.5,3.2,5.1,2.0,Iris-virginica
6.4,2.7,5.3,1.9,Iris-virginica
6.8,3.0,5.5,2.1,Iris-virginica
5.7,2.5,5.0,2.0,Iris-virginica
5.8,2.8,5.1,2.4,Iris-virginica
6.4,3.2,5.3,2.3,Iris-virginica
6.5,3.0,5.5,1.8,Iris-virginica
7.7,3.8,6.7,2.2,Iris-virginica
7.7,2.6,6.9,2.3,Iris-virginica
6.0,2.2,5.0,1.5,Iris-virginica
6.9,3.2,5.7,2.3,Iris-virginica
5.6,2.8,4.9,2.0,Iris-virginica
7.7,2.8,6.7,2.0,Iris-virginica
6.3,2.7,4.9,1.8,Iris-virginica
6.7,3.3,5.7,2.1,Iris-virginica
7.2,3.2,6.0,1.8,Iris-virginica
6.2,2.8,4.8,1.8,Iris-virginica
6.1,3.0,4.9,1.8,Iris-virginica
6.4,2.8,5.6,2.1,Iris-virginica
7.2,3.0,5.8,1.6,Iris-virginica
7.4,2.8,6.1,1.9,Iris-virginica
7.9,3.8,6.4,2.0,Iris-virginica
6.4,2.8,5.6,2.2,Iris-virginica
6.3,2.8,5.1,1.5,Iris-virginica
6.1,2.6,5.6,1.4,Iris-virginica
7.7,3.0,6.1,2.3,Iris-virginica
6.3,3.4,5.6,2.4,Iris-virginica
6.4,3.1,5.5,1.8,Iris-virginica
6.0,3.0,4.8,1.8,Iris-virginica
6.9,3.1,5.4,2.1,Iris-virginica
6.7,3.1,5.6,2.4,Iris-virginica
6.9,3.1,5.1,2.3,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
6.8,3.2,5.9,2.3,Iris-virginica
6.7,3.3,5.7,2.5,Iris-virginica
6.7,3.0,5.2,2.3,Iris-virginica
6.3,2.5,5.0,1.9,Iris-virginica
6.5,3.0,5.2,2.0,Iris-virginica
6.2,3.4,5.4,2.3,Iris-virginica
5.9,3.0,5.1,1.8,Iris-virginica
\end{filecontents*}
\documentclass{article}
\usepackage[inline]{asymptote}
\usepackage{lmodern}
\begin{document}
\begin{figure}
\begin{asy}
settings.outformat="pdf";
settings.tex="pdflatex";
settings.prc=false;
settings.render=0;

size(8cm);
import solids;
import fontsize;
defaultpen(fontsize(9pt));

pen axisPen=darkblue+1bp;
pen frameSolid=gray(0.5)+1bp;
pen frameDashed=frameSolid+linetype(new real[] {3,2});
pen dotRim=gray(0.17);

pen[] clr={white
,mediumred   + opacity(0.5)
,mediumgreen + opacity(0.5)
,mediumblue  + opacity(0.5)
};

path dotMark=scale(0.08)*unitcircle;

triple eyeVec;
triple plane(pair z);

file fin=input("iris.data").csv();
string[][] A=fin.dimension(0,5);

triple[] p;
int[] IrisType;
int[] zIndex;

triple pmin=(1,1,1)*intMax,pmax=-pmin; 

bool less(int i, int j){
  return arclength(p[i]--currentprojection.camera)
    >arclength(p[j]--currentprojection.camera);
}

void calcZindex(){
  zIndex=sort(sequence(p.length),less);
}

void Dot(triple q,pen c){
  triple u, v;
  v=Z;
  u=unit(cross(eyeVec,v)); 
  plane=new triple (pair z) {return q+z.x*u+z.y*v;};
  draw(surface(dotMark,plane),c,nolight);
  draw((shift(q)*rotate(90,u)*path3(dotMark)),dotRim,nolight);  
}

for(int i=0;i<A.length;++i){
  if(A[i].length==5){
    p.push(((real)A[i][0],(real)A[i][1],(real)A[i][2]));
    if(p[i].x<pmin.x)pmin=(p[i].x,pmin.y,pmin.z);
    if(p[i].y<pmin.y)pmin=(pmin.x,p[i].y,pmin.z);
    if(p[i].z<pmin.z)pmin=(pmin.x,pmin.y,p[i].z);
    if(p[i].x>pmax.x)pmax=(p[i].x,pmax.y,pmax.z);
    if(p[i].y>pmax.y)pmax=(pmax.x,p[i].y,pmax.z);
    if(p[i].z>pmax.z)pmax=(pmax.x,pmax.y,p[i].z);
    IrisType.push(0);
    if(A[i][4]=="Iris-setosa")IrisType[i]=1;
    if(A[i][4]=="Iris-versicolor")IrisType[i]=2;
    if(A[i][4]=="Iris-virginica")IrisType[i]=3;
  }
}

currentprojection=orthographic(
camera=(12,10,0.4),
up=Z,
target=(pmin+pmax)/2,
zoom=0.8
);

eyeVec=currentprojection.camera-currentprojection.target;

calcZindex();

triple pmid=0.5(pmin+pmax);

draw((pmin.x,pmid.y,pmid.z)--(pmax.x,pmid.y,pmid.z)
,axisPen,Arrow3(HookHead3,size=4));
label("$X_1$",project((pmax.x,pmid.y,pmid.z)),W);

draw((pmid.x,pmin.y,pmid.z)--(pmid.x,pmax.y,pmid.z)
,axisPen,Arrow3(HookHead3,size=4));
label("$X_2$",project((pmid.x,pmax.y,pmid.z)),E);

draw((pmid.x,pmid.y,pmin.z)--(pmid.x,pmid.y,pmax.z)
,axisPen,Arrow3(HookHead3,size=4));
label("$X_3$",project((pmid.x,pmid.y,pmax.z)),N);

draw(pmin--(pmin.x,pmax.y,pmin.z)--(pmin.x,pmin.y,pmin.z)--(pmax.x,pmin.y,pmin.z)--cycle
 ,frameDashed
);

draw((pmax.x,pmax.y,pmin.z)--pmax,frameDashed);
draw((pmax.x,pmin.y,pmin.z)--(pmax.x,pmax.y,pmin.z)--(pmin.x,pmax.y,pmin.z),frameDashed);

for(int i=0;i<p.length;++i){
  Dot(p[zIndex[i]],clr[IrisType[zIndex[i]]]);
}

draw(pmax--(pmin.x,pmax.y,pmax.z)--(pmin.x,pmin.y,pmax.z)--(pmax.x,pmin.y,pmax.z)--cycle
 ,frameSolid
);

draw((pmax.x,pmin.y,pmin.z)--pmin--(pmin.x,pmax.y,pmin.z),frameSolid);
draw((pmin.x,pmin.y,pmax.z)--pmin,frameSolid);
draw((pmin.x,pmax.y,pmax.z)--(pmin.x,pmax.y,pmin.z),frameSolid);
draw((pmax.x,pmin.y,pmax.z)--(pmax.x,pmin.y,pmin.z),frameSolid);
\end{asy}
\end{figure}
\end{document}
%
% Process with:
%
% pdflatex iris3d.tex
% asy iris3d-*.asy
% pdflatex iris3d.tex

相关内容