# Drawing gamma function in LaTeX

Is there an elegant way to plot gamma function (or some similar non-elementary function),

http://en.wikipedia.org/wiki/Gamma_function

via TikZ or pgfplots? The graph I have in mind is something similar to the following one,

http://intmath.com/blog/wp-content/images/2010/05/gamma-4.gif

The only solution that falls to my mind is the calculation of a list of coordinates (x,\Gamma(x)) with some other (non-TeX) software and then plotting those, but I would like to know if it is possible to avoid this path.

• Hello. Have you tried searching this forum (or anywhere else on the web) for ways how to plot a function in LaTeX? – yo' Jan 20 '15 at 21:41
• TikZ has a set of built-in (predefined) elementary functions (such as exp, ln, sin, etc.) so there is no problem with those. I'm note sure if there is some other way to draw \Gamma(x), apart from e.g. generating the coordinates (x,\Gamma(x)) with some other software, and then plotting those in TikZ or pgf? – Ivica Smolić Jan 20 '15 at 21:48
• Well, the it would be nice to show your effort, or to be more specific. This way it looks like you didn't search at all. And no, I don't think that the gamma function exists... – yo' Jan 20 '15 at 21:53
• I'd try gnuplot. It has an implementation of the gamma function. – 1010011010 Jan 20 '15 at 22:36
• Using essentially the same code I posted for plotting the zeta function, you can plot gamma. You need to import that function, though, as is done here. – DJP Jan 20 '15 at 22:42

There is an elegant way… with the pst-func package:

\documentclass[x11names]{article}

\usepackage{pst-func}
\usepackage{auto-pst-pdf}

\begin{document}
\psset{unit=1.25cm}
\begin{pspicture*}(-4.8,-4.8)(4.8,4.8)
\psaxes[ticksize=2pt -2pt]{->}(0,0)(-4.8,-4.8)(4.8,4.8)[$x$, -120][$y$, -140]
\psset{linecolor=Tomato3,linewidth=1.2pt,plotpoints=100,algebraic}
\psplot{-4.995}{-4.005}{GAMMA(x)}
\psplot{-3.995}{-3.01}{GAMMA(x)}
\psplot{-2.99}{-2.05}{GAMMA(x)}
\psplot{-1.95}{-1.05}{GAMMA(x)}
\psplot{-0.9}{-0.1}{GAMMA(x)}
\psplot{.1}{5.8}{GAMMA(x)}
\psset{linewidth = 0.6pt, linecolor = LightSteelBlue3}
\multido{\i=-4+1}{4}{\psline(\i, -5.8)(\i, 5.8)}
\end{pspicture*}
\end{document}


• I suppose the implication is that GAMMA is a built-in function? neat! – Sean Allred Jan 21 '15 at 2:41
• It's defined in the pst-math module, that called by pst-func. Also defined: GAMMALN. – Bernard Jan 21 '15 at 9:39
• @Bernard: Absolutely great! I couldn't ask for more elegant solution. Thank you! – Ivica Smolić Jan 21 '15 at 9:41

The Gamma function is also built in Asymptote. Here is a reproduction of Bernard's graph with this program.

import graph;
unitsize(1.5cm);
real Xmin=-5, Xmax=5, Ymin=-5, Ymax=5;
// Graphs
for (real x = Xmin; x < 0; x=x+1) {draw(graph(gamma, x+0.001, x+0.999), red);};
draw(graph(gamma, 0.1, Xmax), red);
// Clipping (cut the parts beyond the borders)
clip((Xmin, Ymin) -- (Xmax, Ymin) -- (Xmax, Ymax) -- (Xmin, Ymax) -- cycle);
// Asymptotes (no pun here)
for (real x=Xmin; x<0; x=x+1) {draw((x, Ymin)--(x, Ymax), 0.8*white);};
// Axes
xaxis(xmin=Xmin, xmax=Xmax, Ticks(Step=1, OmitTick(0, Xmax)), arrow=Arrow);
yaxis(ymin=Ymin, ymax=Ymax, Ticks(Step=1, OmitTick(0, Ymin, Ymax)), arrow=Arrow);


1. With pgfplots and gnuplot:

% arara: pdflatex: {shell: yes}
\documentclass[margin=5mm, tikz]{standalone}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}[]

\begin{axis}[
xmin = -4.9, xmax = 5.1,
%ymin = -3.5, ymax = 3.5,
restrict y to domain=-6:6,
axis lines = middle,
axis line style={-latex},
xlabel={$x$},
ylabel={$y$},
%enlarge x limits={upper={val=0.2}},
enlarge y limits=0.05,
x label style={at={(ticklabel* cs:1.00)}, inner sep=5pt, anchor=north},
y label style={at={(ticklabel* cs:1.00)}, inner sep=2pt, anchor=south east},
]

domain = 0:5] gnuplot{gamma(x)};

\foreach[evaluate={\N=\n-1}] \n in {0,...,-5}{%
domain = \n:\N] gnuplot{gamma(x)};
%
\addplot [domain=-6:6, samples=2, densely dashed, thin] (\N, x);
}%
\end{axis}
\end{tikzpicture}
\end{document}


2. Only pgfplots as an approximation:

We can see a good accordance with the exact gnuplot-curve:

\documentclass[margin=5mm, tikz]{standalone}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}[]
\begin{axis}[
xmin =0, xmax = 5.1,
%ymin = -3.5, ymax = 3.5,
restrict y to domain=-6:6,
axis lines = middle,
xlabel={$x$},
ylabel={$y$},
enlarge x limits=0.05,
enlarge y limits=0.1,
x label style={at={(ticklabel* cs:1.00)}, inner sep=5pt, anchor=north},
y label style={at={(ticklabel* cs:1.00)}, inner sep=2pt, anchor=south east},
]