PGFplots would be suited quite well for this. It takes a bit of time to get hang of the PGF/TikZ and the PGFplots syntax, but once you've found out how to do something, it's really easy to wrap it in a style
to apply it to other problems. Here's the example you linked to, drawn using PGFplots:

using this code:
\begin{tikzpicture}
\begin{axis}[
ondrej's graphs,
]
\addplot {e^(-x)};
\addplot +[shift function={0.2}{0.2}] {e^(-x)} node [tangent point=0.3] {};
\addplot +[shift function={0.4}{0.4}] {e^(-x)};
\draw [tangent line];
\draw [point] (tangent) circle;
\pgfplotsset{project point on axes}
\end{axis}
\end{tikzpicture}
And the example from the next page

can be generated using
\begin{tikzpicture}
\begin{axis}[
ondrej's graphs,
xmin=0,xmax=4,
ymin=0,ymax=4
]
\addplot +[sharp plot] coordinates {(0.5,3) (1,1) (3,0.5)};
\addplot +[sharp plot, shift function={0.4}{0.6}] coordinates {(0.5,3) (1,1) (3,0.5)};
\addplot +[sharp plot, shift function={0.8}{1.2}] coordinates {(0.5,3) (1,1) (3,0.5)};
\coordinate (tangent) at (axis cs:1.4,1.6);
\draw [point] (tangent) circle;
\draw [tangent line] (tangent) +(-40:4cm) -- +(-40:-4cm);
\pgfplotsset{project point on axes};
\node [label node] at (rel axis cs:0.03,0.92) {Indifference\\curves};
\node [label node] at (rel axis cs:0.53,0.23) {Budget line};
\end{axis}
\end{tikzpicture}
These code snippets are a bit misleading, since they use a lot of custom styles that you have to write yourself. However, they show how easy it is to create similar plots once you have the styles.
Here's the complete code for the examples:
\documentclass{standalone}
\usepackage{pgfplots}
\usetikzlibrary{decorations.markings}
\pgfplotsset{
ondrej's graphs/.style={
domain=0.2:4,
xmin=0,xmax=5,
ymin=0,
axis lines*=left,
xtick=\empty, ytick=\empty,
xlabel=$x_1$,
ylabel=$x_2$,
every axis y label/.style={
at={(current axis.above origin)},
anchor=east
},
every axis x label/.style={
at={(current axis.right of origin)},
anchor=north
},
cycle list={
ultra thick, orange, no markers, smooth\\
},
shift function/.style 2 args={
x filter/.code={\pgfmathparse{\pgfmathresult+##1}},
y filter/.code={\pgfmathparse{\pgfmathresult+##2}}
},
/tikz/tangent line/.style={
ultra thick, black, shorten <=-4cm, shorten >=-4cm,
insert path={(tangent.west) -- (tangent.east)}
},
/tikz/indicator lines/.style={
thin, densely dashed
},
/tikz/point/.style={
fill,
radius=2.5pt,
},
project point on axes/.code={
\pgfplotsset{/pgfplots/after end axis/.code={
\draw [indicator lines]
(tangent-|{rel axis cs:0,0})
node [anchor=east] {$x_2^*$}
-| (tangent|-{rel axis cs:0,0})
node [anchor=north] {$x_1^*$};
}}
},
/tikz/label node/.style={
font=\small,
align=left,
anchor=west
}
}
}
\tikzset{
tangent point/.style={
sloped,
name=tangent,
pos=#1
},
tangent point/.default=0.5
}
\begin{document}
%\begin{tikzpicture}
%\begin{axis}[
% ondrej's graphs,
%]
%\addplot {e^(-x)};
%\addplot +[shift function={0.2}{0.2}] {e^(-x)} node [tangent point=0.3] {};
%\addplot +[shift function={0.4}{0.4}] {e^(-x)};
%\draw [tangent line];
%\draw [point] (tangent) circle;
%\pgfplotsset{project point on axes}
%\end{axis}
%\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[
ondrej's graphs,
xmin=0,xmax=4,
ymin=0,ymax=4
]
\addplot +[sharp plot] coordinates {(0.5,3) (1,1) (3,0.5)};
\addplot +[sharp plot, shift function={0.4}{0.6}] coordinates {(0.5,3) (1,1) (3,0.5)};
\addplot +[sharp plot, shift function={0.8}{1.2}] coordinates {(0.5,3) (1,1) (3,0.5)};
\coordinate (tangent) at (axis cs:1.4,1.6);
\draw [point] (tangent) circle;
\draw [tangent line] (tangent) +(-40:4cm) -- +(-40:-4cm);
\pgfplotsset{project point on axes};
\node [label node] at (rel axis cs:0.03,0.92) {Indifference\\curves};
\node [label node] at (rel axis cs:0.53,0.23) {Budget line};
\end{axis}
\end{tikzpicture}
\end{document}
standalone
document (standalone
documents are automatically cropped to the size of the content.minimal
is not a document class that should be used for producing anything but test documents for bug hunting). It's perfect for getting elegant graphs with a homogeneous appearance. – Jake Jun 19 '12 at 13:45standalone
tip. Space-limited labeling was a stupid way of saying there are sometimes a lot of curves and it's necessary to fit labels manually (e.g. using coordinates) as automatic placement may fail. – Ondrej Jun 19 '12 at 14:26