\documentclass[tikz]{standalone}
\usepackage{fontspec}
\usepackage{mathtools}
\usepackage{unicode-math}
\usepackage{siunitx}
\newcommand{\az}{\ensuremath{\Phi}}
\newcommand{\el}{\ensuremath{\theta}}
% Tikz Style
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{arrows.meta}
\usepackage{pgfplots}
\pgfplotsset{
compat=1.18
,width=15cm
,lua debug
}
\definecolor{celestial}{rgb}{1,0,1}%{0.0, 0.51, 0.5}
\definecolor{elevation}{rgb}{0,1,0}%{0.6, 0.4, 0.8}
\definecolor{horizon}{rgb}{0,0,1}%{0.54, 0.81, 0.94}
\definecolor{sun}{rgb}{0.83, 0.0, 0.25}
\tikzstyle{help circle} = [dashed, thick]
\tikzstyle{coordinate curve} = [ultra thick]
\tikzstyle{sun position} = [color=sun,ultra thick]
\tikzstyle{navi direction} = [font=\sffamily\Large]
\tikzstyle{coordinate angle} = [font=\Large]
\tikzstyle{base plane} = [font=\sffamily]
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={5}{5}
,axis lines=none,
,plot box ratio={1 1 1}
,xlabel=$x$
,ylabel=$y$
,zlabel=$z$
,xmin=-1.4
,xmax=1.4
% ,ymin=-1.2
% ,ymax=1.2
% ,zmin=-1.2
% ,zmax=1.2
,declare function={
% Sun position
azimuth=-110; % Positive = westward from north
elevation = 65; % Positive = from Horizon to Zenith
sunx = cos(azimuth)*cos(elevation);
suny = sin(azimuth)*cos(elevation);
sunz = sin(elevation);
% Text Az coordinates
textazx = cos(3/5*azimuth);
textazy = sin(3/5*azimuth);
textazz = 0;
% Text El coordinates
textelx = cos(azimuth)*cos(elevation/2);
textely = sin(azimuth)*cos(elevation/2);
textelz = sin(elevation/2);
% Celestial Meridian
ucx = 1;
ucy = 0;
ucz = 0;
%
vcx = 0;
vcy = 0;
vcz = 1;
celestialx(\t) = cos(\t)*ucx + sin(\t)*vcx;
celestialy(\t) = cos(\t)*ucy + sin(\t)*vcy;
celestialz(\t) = cos(\t)*ucz + sin(\t)*vcz;
% Horizon => Azimut
uhx = 1;
uhy = 0;
uhz = 0;
%
vhx = 0;
vhy = 1;
vhz = 0;
horizonx(\t) = cos(\t)*uhx + sin(\t)*vhx;
horizony(\t) = cos(\t)*uhy + sin(\t)*vhy;
horizonz(\t) = cos(\t)*uhz + sin(\t)*vhz;
% Elevation
uex = cos(azimuth);
uey = sin(azimuth);
uez = 0;
%
vex = 0;
vey = 0;
vez = 1;
elevationx(\t) = cos(\t)*uex + sin(\t)*vex;
elevationy(\t) = cos(\t)*uey + sin(\t)*vey;
elevationz(\t) = cos(\t)*uez + sin(\t)*vez;
}
]
%
\draw[->] (0,0,0) -- (1.1,0,0) node[anchor=west,navi direction] {North};
\draw[->] (0,0,0) -- (0,-1.5,0) node[anchor=north,navi direction] {East};
\draw[->] (0,0,0) -- (0,0,1.1) node[anchor=south,navi direction] {Zenith};
\node at ( 0.71, 0,0.71)[anchor=west,outer sep=1ex,base plane] {Meridian}; %0.71 app sqrt(2)/2
\node at (-0.71, 0.71,0) [anchor=south,base plane] {Horizon};
% Plot the Meridian through Nord
\addplot3 [
domain=0:360,
samples=60,
samples y=1,
variable=t,
celestial,help circle
] (
{celestialx(t)},
{celestialy(t)},
{celestialz(t)}
);
% Plot the horizon circle
\addplot3 [
domain=0:360,
samples=60,
samples y=1,
variable=t,
horizon,help circle
] (
{horizonx(t)},
{horizony(t)},
{horizonz(t)}
);
% Plot the azimuth curve
\addplot3 [
domain=0:azimuth+0.5,
samples=60,
samples y=1,
variable=t,
horizon,coordinate curve,
postaction={decorate},
decoration={markings,
mark=at position 0.55 with {\arrow{Latex[round]}}
}
] (
{horizonx(t)},
{horizony(t)},
{horizonz(t)}
);
% Plot the great circle through the sun
\addplot3 [
domain=0:360,
samples=60,
samples y=1,
variable=t,
elevation,help circle
] (
{elevationx(t)},
{elevationy(t)},
{elevationz(t)}
);
% Plot the elevation curve
\addplot3 [
domain=0.5:elevation,
samples=60,
samples y=1,
variable=t,
elevation,coordinate curve,
postaction={decorate},
decoration={markings,
mark=at position 0.5 with {\arrow{Latex[round]}}
}
] (
{elevationx(t)},
{elevationy(t)},
{elevationz(t)}
) ;
\draw [-{Latex[round]}, sun position] (0,0,0) -- (sunx, suny, sunz) node[anchor=south east,inner sep=0] {$\odot$};
\draw [sun position, thin](0,0,0) -- (uex, uey, 0);
\node at (textazx, textazy, textazz) [anchor=north,coordinate angle] {\az};
\node at (textelx, textely, textelz) [anchor=east ,coordinate angle] {\el};
\end{axis}
\end{tikzpicture}
\end{document}