Ungeachtet des Umstandes, dass das eine perspektivisch verwirrende Darstellung ist, kann man mit pgfplots ein 3D-Bardiagramm so erstellen:
Die Idee ist mark=cube*
zu verwenden und die cube/size z
so zu manipulieren, dass die gewünschten 3D-Bars entstehen.
Ähnlich der Antwort von @Community, mit dem Unterschied, dass das Auslesen und verwenden der Einheitslänge in z-Richtung automatisiert verlaufen soll.
Setzt man z.B. cube/size z=4mm
, so dimensioniert das Würfelchen von seiner Raumposition aus um 2mm und um -2mm in z-Richtung.
Also müssen sie bei x=X, y=Y, z expr={0.5*\thisrow{Z}}
positioniert werden.
Die richtige Höhe der cubes kann mit visualization depends on={\thisrow{Z} \as \zvalue},
scatter/@pre marker code/.append style={
/utils/exec=\pgfmathsetmacro{\barheight}{\zunitlength*\zvalue},
/pgfplots/cube/size z=\barheight },
bestimmt werden, wobei die zunitlength
mit \path let \p1=($(axis cs:0,0,1)-(axis cs:0,0,0)$) in
\pgfextra{ \pgfmathsetglobalmacro{\zunitlength}{\y1} } };
gemessen werden kann.
€dit: Es zeigt sich, dass es sinnvoll ist zmax=\zMax
zu setzen, dazu kann der maximale z-Wert \zMax
in der Form
\pgfplotstablegetrowsof{\datatable}
\pgfmathtruncatemacro{\RowsNo}{\pgfplotsretval-1}
%Zeilenzahl: \RowsNo
\pgfmathsetmacro\zMax{0}
\foreach \n in {0,...,\RowsNo}{
\pgfplotstablegetelem{\n}{Z}\of{\datatable}
\pgfmathparse{\pgfplotsretval > \zMax ? \pgfplotsretval : \zMax}
\xdef\zMax{\pgfmathresult}
}
%Maximalwert z-Achse: \zMax
ermittelt werden.
\documentclass[border=5pt, tikz]{standalone}\usepackage{pgfplots}\usepackage{pgfplotstable}\pgfplotsset{compat=1.17}\usetikzlibrary{calc}\def\pgfmathsetglobalmacro#1#2{\pgfmathparse{#2}%\global\let#1\pgfmathresult}\pgfplotsset{ colormap = {mycolormap}{ color(0) = (blue!50!black); color(1) = (purple); color(2) = (green!55!black); color(3) = (brown); color(4) = (blue!66) color(5) = (violet) }, colormap name=mycolormap, %colormap name=viridis}\begin{document}\pgfplotstableread[col sep=comma,header=true]{ X, Y, Z 2, 0, 4 1, 0, 5 0, 1, 10 3, 1, 1 1, 1, 3 2, 1, 0 1, 2, 0 2, 2, 5 2, 3, 6 1, 4, 7 1, 5, 11 }{\datatable}\begin{tikzpicture}[] \begin{axis}[ %height=2cm, width=7cm, % view={120}{40}, x dir=reverse, xmin=0, ymin=0, zmin=0, enlarge z limits={rel=0.25,upper}, xtick={1,...,10}, ytick={1,...,10}, grid=both, xlabel={$x$}, ylabel={$y$}, zlabel={$z$}, minor z tick num=1, point meta=explicit, scatter/use mapped color={draw=mapped color!50!black, fill=mapped color!70}, ] % unitlenghth z-Achse ermitteln: \path let \p1=($(axis cs:0,0,1)-(axis cs:0,0,0)$) in \pgfextra{\pgfmathsetglobalmacro{\zunitlength}{\y1}} node[yshift=-1cm]{%\zunitlength % anzeigen}; \addplot3[ scatter, only marks, mark=cube*, mark size=5, %opacity=0.8, nodes near coords*=, % will er...%%% barheight bestimmen visualization depends on={\thisrow{Z}\as\zvalue}, scatter/@pre marker code/.append style={ /utils/exec=\pgfmathsetmacro{\barheight}{\zunitlength*\zvalue}, /pgfplots/cube/size z=\barheight}, ] table[x=X, y=Y, z expr={0.5*\thisrow{Z}}, meta expr={\thisrow{Y}} ]{\datatable}; \end{axis}\end{tikzpicture}\end{document}