如何通过指示三维元素的体积而不是其位置来绘制图形

如何通过指示三维元素的体积而不是其位置来绘制图形

我有大约五千个观测值,我想将它们绘制成图表。由于值的范围很广(从 1 到 108,000,其中 90% 的观测值为 2,99% 的观测值为 1 到 6 之间的值,只有一个观测值的最大值为 108,000),我认为以图形方式表示它们的唯一方法是使用体积图(即 3D)。图中球体的周长范围为 3.89 到 185.62(然后可能 - 保持相同的比例 - 0.08cm 到 3.7cm)。

这是我的数据以及体积相当于的球体的周长(以厘米为单位)Var1

在此处输入图片描述

编辑:TikZ画圆时需要半径作为属性,而不是周长,这是我错误的想法。我相应地更正了下面的公式。

当然,图表不需要清楚地显示所有小值。我想给出的是一个大球体漂浮在微球海洋中的概念。就像这样:

在此处输入图片描述

首先我们定义一个脚本来从球体的体积中获取半径。该R脚本是:

radiusFromVolume <- function(volume){
  radius <- (volume/((4/3)*pi))^(1/3)
  radius <- radius/10
  radius <- round(radius, digits=2)
  return(radius)
}

从 R 脚本中,我将获得一个半径值向量。现在到了最难的部分。在这些值上,我想为向量中的每个项目绘制一个球体,并将它们(随机?)放置在我的图中。

感谢这个答案(作者:汤姆·邦巴迪尔)我得出了这个基本脚本,它可以给出两个半径分别为 0.06 和 2.96 的球体。

\documentclass[a4paper]{article}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
    \draw (0,0) circle (2.96cm);
    \shade[ball color=blue!10!white,opacity=0.70] (0,0) circle (3.7cm);
    \draw (3,0) circle (0.06cm);
    \shade[ball color=blue!10!white,opacity=0.70] (3,0) circle (0.08cm);
\end{tikzpicture}

\end{document}

从这个脚本开始,用伪代码我试图得到的是:

vector <- {volume values} % The values are actually ordered from bigger to smaller to avoid the small spheres to be covered by the biggest spheres
figure_box <- {(-4,-4),(4,4)}

\begin{tikzpicture}


for (item in vector) {

size <- item 
coordinates <- ( random(>-4 && <4) , random(>-4 && <4) )
\draw (coordinates) circle (size cm);
\shade[ball color=blue!10!white,opacity=0.70] (coordinates) circle (size cm);

}
\end{tikzpicture}

是否可以通过TeX和获得tikz

编辑:

为什么不使用对数/对数刻度?我的数据的问题在于我有一个很大的异常值。我的数据的对数-对数图将如下所示

在此处输入图片描述

或者像这样

在此处输入图片描述

显然,我的异常值(因为与其他值相差甚远)甚至没有显示出来(您只能从 X 刻度看出它在那里)。此外,中位数观察者也不太容易理解对数刻度。(相反,球体积的差异更容易看到……)

答案1

您既不应该使用对数条形图(您可以将“基数”选择为例如 10 1或 10 -5,这将极大地改变“条形”的外观),也不应该使用连续线,因为您有离散值(没有 1.5 的数据)。在我看来,双对数散点图是最好的:

代码

\documentclass[tikz,border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\usepackage{kerkis}

\begin{document}

\begin{tiny}

\pgfplotsset{grid style={very thin,gray!30}}

\begin{tikzpicture}
    \begin{loglogaxis}
    [   scatter,
        scatter src=y,
        only marks,
      x tick label style={align=right,rotate=90},
      enlarge x limits=0.01,
      enlarge y limits=0.02,
      grid=minor,
      log ticks with fixed point,
      xmax=200000,
    ]
        \addplot coordinates {(1,180) (2,5400) (3,240) (4,120) (5,40) (6,20) (108000,1)};
    \end{loglogaxis}
\end{tikzpicture}

\end{tiny}

\end{document}

输出

在此处输入图片描述

答案2

我最终得到了这个解决方案:

\documentclass[a4paper]{article}

\usepackage{datatool, tikz}
\begin{filecontents*}{test.csv}
id,ball_radius
1,2.96
2,0.14
3,0.14
4,0.13
5,0.12
6,0.12
7,0.12
8,0.12
9,0.12
10,0.12
11,0.12
12,0.12
13,0.12
14,0.12
15,0.11
\end{filecontents*}

\begin{document}

\DTLloaddb[noheader=false]{radius}{"test.csv"}

\begin{tikzpicture}
 \DTLforeach*{radius}{\radius=ball_radius} {%
    \pgfmathsetmacro\X{rand*1.5}
    \pgfmathsetmacro\Y{rand*1.5}
    \draw (\X,\Y) circle (\radius);
    \shade[ball color=green] (\X,\Y) circle (\radius);}  
\end{tikzpicture}

\end{document}

输出:

在此处输入图片描述

相关内容