# Plotting the chi square distribution with TikZ

I have tried without success to plot the curve of the chi-squared distribution. Is there a generous soul who can come to my rescue.

• Show what you've tried so far in form of a minimal example and add this to your question. – Thorsten Donig Jan 12 '12 at 20:33
• Thanks for the gnuplot and PSTricks based solution. But I am still looking for a TikZ based solution. Anyone to help? – hmhsl Jun 29 '15 at 6:40
• This is trivial using either pgfplots or even the plot option in tikz. I don't have access to a computer right now, but since you have the function to be plotted in closed form, using pgfplots (which uses tikz), it would require an \addplot[samples=200,domain=0.001:5]{function goes here}; or something like that. – JPi Jun 29 '15 at 7:07

If you can access gnuplot, you can try this. This is an adapted version of a gnuplot demo file.

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
xlabel = $x$,
ylabel = {Probability density},
samples = 200,
restrict y to domain = 0:0.5,
domain = 0.01:15]
\foreach \k in {1,...,8} {%
isint(x) = (int(x)==x);
log2 = 0.693147180559945;
chisq(x,k)=k<=0||!isint(k)?1/0:x<=0?0.0:exp((0.5*k-1.0)*log(x)-0.5*x-lgamma(0.5*k)-k*0.5*log2);
set xrange [1.00000e-5:15.0000];
set yrange [0.00000:0.500000];
samples=200;
plot chisq(x,\k)};
\addlegendentryexpanded{$k = \k$}}
\end{axis}
\end{tikzpicture}
\end{document}

• To see a solution with LuaLaTeX, see here. – Azoun Jan 15 '12 at 1:07
• The curve for the case $k=0$ is missing.This isn't exactly a surprise, because the chi-squared distribution isn't defined properly for $k=0$... I suggest you update the plot to drop the case $k=0$ from the legend. – Mico Jan 14 '15 at 8:28

if you can use PSTricks, then it is easy. Run the example with xelatex

\documentclass{article}
\usepackage{pst-plot,pst-func}
\begin{document}

\psset{xunit=1.2cm,yunit=10cm,plotpoints=200}
\begin{pspicture*}(-0.75,-0.05)(9.5,.65)
\multido{\rnue=0.5+0.5,\iblue=0+10}{10}{%
\psChiIIDist[linewidth=1pt,linecolor=blue!\iblue,nue=\rnue]{0.01}{9}}
\psaxes[Dy=0.1,ticksize=0 3pt]{->}(0,0)(9.5,.6)
\end{pspicture*}

\end{document}


• Thanks for taking the time to answer my request but when I run the code I have this message of error: ! Package xkeyval Error: plotpoints' undefined in families ,pstricks,pst-grad ,pst-slpe,pst-node,pst-fun'. See the xkeyval package documentation for explanation. Type H <return> for immediate help. ... l.5 \psset{xunit=1.2cm,yunit=10cm,plotpoints=200} ? x Any help would be appreciated. Sincerly. – Zbigniew Jan 18 '12 at 20:10
• best result with texlive Unlike MiKTteX. Thank you to everyone. – Zbigniew Jan 18 '12 at 20:21
• You may have an outdated version of pstricks. Since you're using TeX Live, call tlmgr update --self --all from your terminal (command prompt). – Werner Jan 18 '12 at 20:46
• add \usepackage{pst-plot} to the preamble – user2478 Jan 18 '12 at 20:57

Here is a sketch of pure TikZ solution. The idea is that Gamma function is not available in tikz (tex), but the values of Gamma(k/2) for k=1,...,8 are simple. So we can "hardcode" them.

If somebody wants to put axes and legend, feel free to edit this answer ;)

\documentclass[tikz,border=7mm]{standalone}
\begin{document}
\begin{tikzpicture}[domain=.001:15,samples=200,thick]
\clip (-1,-1) rectangle (15,10);
\foreach[count=\k,evaluate={\z=\k>2?"(0,0)--":"";\c=10*\k}]
\g in {sqrt(pi),1,sqrt(pi)/2,1,3/4*sqrt(pi),2,15/8*sqrt(pi),6}
\draw[color=blue!\c!red,yscale=30] \z
plot (\x,{exp(ln(\x/2)*\k/2-ln(\x)-\x/2-ln(\g))});
\end{tikzpicture}
\end{document}


Here is my "lazy" solution:

1. generate the curve using Octave/MATLAB, then save the points in a CSV file:

x = .1:.1:8;
pdf1 = chi2pdf(x,1);
pdf2 = chi2pdf(x,2);
m = [x' pdf1' pdf2' pdf3' pdf4' pdf5' pdf6' pdf7' pdf8'];
csvwrite ('chisquare.csv', m);

2. import the data in LaTeX:

\pgfplotstableread[col sep=comma]{chisquare.csv}\dataChiSquare

3. Draw the plots:

\pgfplotsinvokeforeach{1,2,3,4,5,6,7,8}{
\addplot table[x = x, y = pdf#1] from \dataChiSquare;
}


You can find the full working code and the already-generated .csv file in this question.