8

I was trying to plot graph of sine functions. I found PSTricks and tried using it, but I have no idea whether there are more standard / more appropriate packages to do this.

Here is what I did (which was miserable):

\psset{unit=1cm}
\begin{center}
\begin{pspicture}(-3.5,-2)(6.5,2)
    \psaxes[dx=\pstPI4,trigLabelBase=2,trigLabels]{->}(0,0)(-3.2,-1.25)(6.5,1.25)
    \psplot[xunit=0.5cm,linecolor=red,linewidth=1.5pt,plotpoints = 100]{-\psPiTwo}{\psPiFour}{x RadToDeg sin}
\end{pspicture}
\end{center}

Would any of you mind giving me some suggestions on how to make this better? I actually don't really understand why I need to put {-\psPiTwo}{\psPiFour} in the part where it is, but I tried changing that to some other things and they do not seem to work well.

Thanks!

  • I found that plotting using tikz is really easy. For examle with \draw[domain=0:7] plot (\x, {sin(\x)});. But there is also the very convenient pgfplots package, based on tikz/pgf that has even more special purpose commands for drawing plots with axis and all. – bodo Jul 21 '12 at 08:43
  • @canaaerus Thanks for the package suggestion. So I tried using it and I found out that the code is way more readable. However, I need to specify all the tick marks myself were I to use pi instead of the usual integer tick marks. That part is pretty annoying, but your answer truly makes my life much easier. Thank you very much! – KangarooWest Jul 21 '12 at 11:58
  • The documentation of pst-Plot has a lot of examples. –  Jul 21 '12 at 12:47
  • @cmhughes That post does help a lot, but as I responded, is there a way to do it in tikz/pgf such that I have the pi style labels on the axis without having to list the numbers (like 3.14159....) and listing the \frac{\pi}{2} sort of stuff. – KangarooWest Jul 22 '12 at 03:22

2 Answers2

10

Here is something that should get you going.

\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
grid=both,
domain=-2*pi:2*pi,
samples=200,
no marks,
xticklabels={-2$\pi$,-1.5$\pi$,...$\pi$,2$\pi$},
xtick={-6.2832,-4.7124,...,6.2832},
x post scale=1.5
]
\addplot {2*sin(deg(x))+0.8*sin(pi*deg(x))};
\end{axis}
\end{tikzpicture}
\end{document}

enter image description here

percusse
  • 157,807
9

Description of the user defined constants:

enter image description here

Note that: the description diagram above uses constants to provide enough spaces for annotations. And the following example uses different constants. Don't get confused!

User defined constants:

\def\f(#1){sin(#1)}% function to plot
\def\g(#1){1.5*cos(2*#1)}% function to plot

\const{Width}{10}% total width in cm
\const{Height}{4}% total height in cm 

\const{POL}{-0.20}% pspicture left offset in cm
\const{POR}{ 0.50}% pspicture right offset in cm
\const{POB}{-0.20}% pspicture bottom offset in cm
\const{POT}{ 0.50}% pspicture top offset in cm

\const{AOL}{-0.20}% axis left offset in cm
\const{AOR}{ 0.30}% axis right offset in cm
\const{AOB}{-0.20}% axis bottom offset in cm
\const{AOT}{ 0.30}% axis top offset in cm

\const{DomL}{-2*pi}% domain left  
\const{DomR}{2*pi}% domain right  
\const{DomB}{-2}% domain bottom  
\const{DomT}{ 2}% domain top 

\const[0]{TrigLabelBase}{2}% denominator for a fraction of pi

Output and the complete code:

enter image description here

\documentclass[border=0pt,pstricks]{standalone}
\usepackage{pst-eucl,pstricks-add}
\usepackage[nomessages]{fp}
\newcommand\const[3][3]{\expandafter\FPeval\csname#2\endcsname{round(#3:#1)}}


% User defined data:
\def\f(#1){sin(#1)}% function to plot
\def\g(#1){1.5*cos(2*#1)}% function to plot

\const{Width}{10}% total width in cm
\const{Height}{4}% total height in cm 

\const{POL}{-0.20}% pspicture left offset in cm
\const{POR}{ 0.50}% pspicture right offset in cm
\const{POB}{-0.20}% pspicture bottom offset in cm
\const{POT}{ 0.50}% pspicture top offset in cm

\const{AOL}{-0.20}% axis left offset in cm
\const{AOR}{ 0.30}% axis right offset in cm
\const{AOB}{-0.20}% axis bottom offset in cm
\const{AOT}{ 0.30}% axis top offset in cm

\const{DomL}{-2*pi}% domain left  
\const{DomR}{2*pi}% domain right  
\const{DomB}{-2}% domain bottom  
\const{DomT}{ 2}% domain top 

\const[0]{TrigLabelBase}{2}% denominator for a fraction of pi

% Internal used constants:
\const{XUnit}{(Width-POR+POL-AOR+AOL)/(DomR-DomL)}
\const{YUnit}{(Height-POT+POB-AOT+AOB)/(DomT-DomB)}

\const{PicL}{(POL+AOL)/XUnit+DomL}
\const{PicR}{(POR+AOR)/XUnit+DomR}
\const{PicB}{(POB+AOB)/YUnit+DomB}
\const{PicT}{(POT+AOT)/YUnit+DomT}

\const{AxiL}{AOL/XUnit+DomL}
\const{AxiR}{AOR/XUnit+DomR}
\const{AxiB}{AOB/YUnit+DomB}
\const{AxiT}{AOT/YUnit+DomT}

\const{DeltaX}{pi/TrigLabelBase}

\psset{xunit=\XUnit,yunit=\YUnit,algebraic,plotpoints=500}

\begin{document}


\begin{pspicture}[showgrid=false](\PicL,\PicB)(\PicR,\PicT)
    \psplot[linecolor=red]{\DomL}{\DomR}{\f(x)}
    \psplot[linecolor=blue]{\DomL}{\DomR}{\g(x)}
    \psaxes
    [
        trigLabels=true,
        labelFontSize=\scriptscriptstyle,
        tickcolor=gray,
        ticksize=-1.5pt 1.5pt,
        xlabelsep=3pt,
        arrowscale=1,
        trigLabelBase=\TrigLabelBase,
        dx=\DeltaX,% must come before xunit to avoid getting a strange output!  
    ]{->}(0,0)(\AxiL,\AxiB)(\AxiR,\AxiT)[$x$,0][$y$,90]
\end{pspicture}


\end{document}