如何根据点的类型表示密度三维图

如何根据点的类型表示密度三维图

我想绘制一个包含 xyz 点的数据集,每个点都有一个0(成功)和1 (错误)作为实验的结果。数据文件“data_all_10m.dat”位于此关联

我已经用 测试了 Gnuplot splotset palette rgb 33,13,10但结果令人困惑,无法清楚地看清大多数0或位于1何处。

在此处输入图片描述

我曾尝试绘制密度图。对于每个点,我计算 0.5 附近 1 和 0 的数量,并根据此数量分配颜色。包含此计数的文件是“data_all_10m_color.dat”,也在关联。该文件中的第 5 列是 0 的数量,第 6 列是 1 的数量。使用 Gnuplot 绘图

splot FILE u 1:2:3:($5/($5+$6)) w p ps 0.75 pt 7 lc palette z notitle

在此处输入图片描述

稍微好一点,但还是不太清楚。Gnuplot 是一个很好的工具,但似乎没有太多方法可以进行这种类型的表示。

我相信 Tikz 和 pgfplots 在制作 3D 图方面更有资源,并且我想知道是否可以制作一个可以更好地表示点的闭合和分布的图形。

编辑

使用以下代码:

\documentclass[border=9,tikz]{standalone}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}[scale=0.75]
  \begin{axis}[colorbar]
    \addplot3[opacity=0.25, contour filled, scatter, only marks] table [x index=0, y index=1, z index=2, scatter src=\thisrowno{3}, col sep=space] {error3D_Zsorted.dat};
  \end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

文件在上面的链接中。我已按 Z 值对点进行排序(较低的 Z 将比较高的 Z 先绘制)。文件的第四列是点的颜色。我不得不使用 LuaTex,因为我有大约 10000 个点(我的计算机无法使用 LaTeX 或 pdfLaTeX 进行编译)。

结果仍然不太明显。不知道是否可以改进。我尝试过shader=interp其他选项,但得到的绘图效果并不好。

也许最好的办法是投影到 2D 但保留 3D 表示。我不知道如何做到这一点,但我已经制作了两个图。首先在 XY 平面投影中:

使用相同的代码error.dat,但使用

\addplot[ opacity=0.25, contour filled, scatter, only marks] table [x index=0, y index=1, scatter src=\thisrowno{2}, col sep=space] {error.dat};

在此处输入图片描述

另一个是在 XZ 平面上:

在此处输入图片描述

使用errorZ.dat,并且,

\addplot[ opacity=0.25, contour filled, scatter, only marks] table [x index=0, y index=1, scatter src=\thisrowno{2}, col sep=space] {errorZ.dat};

opacity=0.2让我们看看不同重叠点的混合,几乎是一个很好的结果,可以知道哪里有更多的 0 而不是 1(在最后一列我使用的数据文件的值中表示)。我试过密度图的例子邮政,但它们对我的数据不起作用,我不知道为什么。

我将非常感激任何能够以某种方式表示这些数据的帮助,以便让人们了解数据文件中最后一列的不同值位于何处。如果 3D 图无法改进,我希望尽可能获得占据平面 XY、XZ 和 YZ 的 2D 表示,这些平面在 3D 轴上一起显示。我非常想使用 TikZ 和 LaTeX,因为它们的质量明显优于 Gnuplot。

问候

答案1

我不清楚什么是响应(错误/成功)变量,因为有四个变量 error3D_Zsorted.dat但没有名称,并且它们都没有 0-1 值。

无论如何,主要问题不是使用 R 或其他东西,而是您拥有大量数据,因此您应该使用非常小的点,并且最好不要完全不透明。

而不是或Gnuplot,我的方法是使用 R 包通过简单的代码生成漂亮的 3D 图(尽管应该稍微修剪一下),但使用 tikz 设备可以拥有完整的 LaTeX 外观和感觉。假设颜色是四维的,结果可能是:pgfplotstikzknitrplot3D

姆韦

\documentclass{article}
\usepackage{lipsum,graphicx}
\begin{document}
\lipsum[1][1-4]
% Next line must be only one line ! 
<<plot4d,echo=F, dev='tikz', out.extra='trim={0cm 4cm 0cm 4.5cm},clip', fig.cap="The definitive 4D plot.", fig.align='center', fig.pos="h!", fig.width=5, out.width=".8\\linewidth">>=
library("plot3D")
df <- read.csv("error.dat",sep=" ", header = F)
x <-  df$V1
y <-  df$V2
z <-  df$V3
r <-  df$V4
scatter3D(x, y, z, theta = 45, phi = 5, cex = 0.5, colvar=r, 
colkey = list(side = 4, length = 0.4), clab =c("response","",""))
@
\lipsum[2-6]
\end{document}

编辑:使用data_all_10m_color.dat(我将其重命名为以data.dat简化)方法相同,只是在这种情况下数据现在是表格化的,因此您应该设置sep="\t"为导入数据。另一方面,现在颜色标度没有意义,因为只有两个可能的值,因此简单的图例更方便。还有一些其他可选更改:

姆韦

\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum[1][1-4]
<<plot4d,echo=F, dev='tikz', out.extra='trim={0cm 5cm 0cm 4cm},clip',fig.cap="4D scatter plot.", fig.align='center', fig.pos="h!", fig.width=6, out.width="\\linewidth">>=
library("plot3D")
df <- read.csv("data.dat",sep="\t", header = F)
x <-  df$V1
y <-  df$V2
z <-  df$V3
r <-  df$V4
# par(mar=c(3,1,1,9))
scatter3D(x, y, z, theta = 55, phi = 15, cex = 0.5, col=alpha.col(col=c("red","green")), colvar=r,scale=F,colkey = F, ticktype = "detailed",
xlab = "x values", ylab = "y values", zlab ="z values")
legend(0,.2, legend=c("ouch!", "yes!"), pch=1, col=c("red", "green"), cex=1, horiz=T)
@
\lipsum[2-6]
\end{document}

相关内容