# TikZ: Draw different shapes of lp-Norm

I am trying to reproduce the picture below using TikZ.

A similar question was already asked here, but I wasn't able to apply the answers to my problem since I need the exact same picture not only the shapes. I tried to modify the given answers but that didn't lead to anything useful because I don't really understand pgfplots and I'm relatively new to TikZ ...

That is what I have done so far.

\begin{tikzpicture}
\foreach \x in {0,4.5,9,13.5}{
\draw [->] (-1.2-\x,0)--(2.5-\x,0);
\draw [->] (0-\x,-1.2)--(0-\x,1.7);
\draw[shorten <=-1cm, shorten >=-3mm] (0-\x,1)--(2-\x,0) node [midway, above] {$A$};
}

\draw[blue] (-10,0)--(-9,1)--(-8,0)--(-9,-1)--cycle;
\draw [blue](-4.5,0) circle (0.88cm);

\foreach \x in {0.66}{
\draw[blue] (-\x,-\x)--(-\x,\x)--(\x,\x)--(\x,-\x)--cycle;
}

\draw[blue,scale=1,domain=0:90,samples=100,smooth,variable=\t]
plot({-1*cos(\t)^(3)-13.5},{1*sin(\t)^(3)});
\draw[blue,scale=1,domain=0:90,samples=100,smooth,variable=\t]
plot({-1*cos(\t)^(3)-13.5},{-1*sin(\t)^(3)});
\draw[blue,scale=1,domain=0:90,samples=100,smooth,variable=\t]
plot({1*cos(\t)^(3)-13.5},{-1*sin(\t)^(3)});
\draw[blue,scale=1,domain=0:90,samples=100,smooth,variable=\t]
plot({1*cos(\t)^(3)-13.5},{1*sin(\t)^(3)});

\end{tikzpicture}


The picture below shows the result. The code is horrific but it is the best I can come up with for now ...

• could you please post what have you done so far? – naphaneal Jul 18 '16 at 13:38
• @naphaneal yes, but how do i display code in the comment environment? or should i use the "Answer Your Question" button? – philipp2357 Jul 18 '16 at 14:52
• click on edit in your question, paste your code, mark it, then click on the {} symbol. your code will be displayed on a grey background. – naphaneal Jul 18 '16 at 15:41
• Are the shapes supposed to be cosmetic? As in, no actual mathematical precision? – Alenanno Jul 18 '16 at 19:18
• Please always post compilable code, rather than just a fragment as it makes it much easier to reproduce what you are seeing. – cfr Jul 18 '16 at 21:37

Possibly something like this? It may not be maximally efficient as I started from the code in the question and something which plots each one might provide greater elegance.

\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[>=Stealth]
\foreach \i in {0,...,3}{
\begin{scope}[xshift=\i*4.5cm]
\draw [<->] (-1.2,0)--(2.5,0);
\draw [<->] (0,-1.2)--(0,1.7);
\draw[shorten <=-1cm, shorten >=-3mm] (0,1)--(2,0) node [midway, above] {$A$};
\end{scope}
}
\begin{scope}[draw=blue, densely dashed]
\draw [] (-1,0)--(0,1)--(1,0)--(0,-1)--cycle;
\draw [](4.5,0) circle (0.88cm);
\draw [xshift=9cm] (-.66,-.66) rectangle (.66,.66);
\begin{scope}[xshift=13.5cm]
\draw [domain=0:90,samples=100,smooth,variable=\t] plot({-1*cos(\t)^(3)},{1*sin(\t)^(3)});
\draw [domain=0:90,samples=100,smooth,variable=\t] plot({-1*cos(\t)^(3)},{-1*sin(\t)^(3)});
\draw [domain=0:90,samples=100,smooth,variable=\t] plot({1*cos(\t)^(3)},{-1*sin(\t)^(3)});
\draw [domain=0:90,samples=100,smooth,variable=\t] plot({1*cos(\t)^(3)},{1*sin(\t)^(3)});
\end{scope}
\foreach \i [count=\j from 0] in {(0,1),(.39,.79),(.66,.66),(0,1)} \scoped [xshift=\j*4.5cm] { \draw [{Circle[width=3pt, length=3pt, fill=black, black]}-{Circle[width=3pt, length=3pt, fill=black, black]}, shorten <=-1.5pt, shorten >=-1.5pt] (0,0) node [below left] {$x$} -- \i node [above right] {$\hat x$} ; };
\end{scope}
\foreach \i [count=\j from 0] in {1,2,\infty,\frac{1}{2}} \scoped [xshift=\j*4.5cm] { \node [anchor=mid west] at (0,-1.5) {$p=\i$}; };
\end{tikzpicture}
\end{document}