我有大约五千个观测值,我想将它们绘制成图表。由于值的范围很广(从 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}
输出: