# How can I make code of tikzpicture to plot the graph of $sin x$ as shown in the figure?

TeX - LaTeX Asked by Noor Aslam on August 29, 2020

I want to plot the graph of sin(x), getting the degrees on the x-axis as shown in the figure. I tried like this, but it is not like what I want. Can someone help providing me the code?

documentclass[10pt]{article}
usepackage{pgf,tikz,pgfplots}
pgfplotsset{compat=1.15}
usepackage{mathrsfs}
usetikzlibrary{arrows}
pagestyle{empty}
begin{document}
definecolor{uuuuuu}{rgb}{0.26666666666666666,0.26666666666666666,0.26666666666666666}
begin{center}
begin{tikzpicture}
begin{axis}[width=2.5in,axis equal image,
xmax=3.5,ymax=1.2,
axis lines=middle,
enlargelimits,
axis line style={shorten >=-0.25cm,shorten <=-0.25cm,latex-latex},
ticklabel style={fill=white},
xtick={0,1,2}, ytick={0,0.5,1},
xlabel=$x$,ylabel=$y$,
clip=false,]
addplot[domain=0:2.5,mark=none,samples=200] {(sin(deg(x)))} node[fill=white, right]{$y=sin(x)$};
draw [fill=black] (1,0.845) circle (1.50pt);
end{axis}
end{tikzpicture}
end{center}
end{document}


I know how to plot the points in shown in figure, but I don’t know how to get degrees on the x-axis.

When you want degrees on the x-axis, I think it makes sense to plot using degrees as well. So instead of domain=0:2.5 and sin(deg(x)), use domain=0:360 and sin(x). When you do this you need to remove axis equal image.

Having done that, you just need to format the ticklabels. By using xticklabel you can set the general format for the ticklabels, so to add a degree sign you can add the following to the axis options:

xticklabel={$pgfmathprintnumber{tick}^{circ}$}


tick contains the x-value at the ticks, so use pgfmathprintnumber to format the number, and add a degree sign with the normal ^{circ}. (Note this is different from xticklabels, with an s at the end, where you write a list of the ticklabels you want.)

You need to change the xtick setting you already have of course, I replaced it with xtick distance=90 which gives you a tick every 90 degrees. If you want more frequent tick you should increase the width of the plot.

To get markers at specific points, one way is to add a second addplot like this:

addplot[only marks,mark=*,samples at={0,90,...,360}] {sin(x)};


Here the x-values are stated explicitly with the samples at key. An alternative method is to use the mark repeat key, which lets you have markers at every nth sample point:

addplot[
domain=0:360,
samples=181, % with domain=0:360 and 181 samples you get a sample every 2 degrees
mark=*,
mark repeat=45 % add a mark for every 45 sample, meaning you get a mark every 90 degreees
] {sin(x)} node[fill=white, right=2mm, pos=0.35]{$y=sin(x)$};


Irrelevant sidenote: when loading pgfplots, you don't need tikz and pgf in addition, they will be loaded by pgfplots anyway.

documentclass[10pt]{article}
usepackage{pgfplots}
pgfplotsset{compat=1.15}
usepackage{mathrsfs}
usetikzlibrary{arrows}
pagestyle{empty}
begin{document}
begin{center}
begin{tikzpicture}
begin{axis}[
width=2.5in,
xmax=380,ymax=1.2,
axis lines=middle,
enlargelimits,
axis line style={shorten >=-0.25cm,shorten <=-0.25cm,latex-latex},
ticklabel style={fill=white},
ytick={-1,-0.5,0,0.5,1},
xlabel=$x$,
ylabel=$y$,
clip=false,
xtick distance=90,
xticklabel={$pgfmathprintnumber{tick}^{circ}$}
]

domain=0:360,
samples=181, % with domain=0:360 and 181 samples you get a sample every 2 degrees
mark=*,
mark repeat=45 % add a mark for every 45 sample, meaning you get a mark every 90 degreees
] {sin(x)} node[fill=white, right=2mm, pos=0.35]{$y=sin(x)$};

% alternative method
%addplot[domain=0:360,mark=none,samples=100] {sin(x)} node[fill=white, right=2mm, pos=0.35]{$y=sin(x)$};

end{axis}
end{tikzpicture}
end{center}
end{document}


Correct answer by Torbjørn T. on August 29, 2020

Compile with Asymptote. asymptote.ualberta.ca

import graph;
size(10cm,5cm,false);

real sinx(real x){return sin(x);}
path g=graph(sinx,0,2pi,350);
draw(g);

draw(Label("$x$",EndPoint,black),(-1,0)--(2*pi+0.5,0),blue,Arrow);
label(Label("$x'$",BeginPoint,black),(-1,0)--(2*pi+0.5,0));
draw(Label("$y$",EndPoint,black),(0,-1.5)--(0,1.5),darkgreen,Arrow);
label(Label("$y'$",BeginPoint,black),(0,-1.5)--(0,1.5));

real marginx=0.1, marginy=0.07;

for (int i: new int[]{-1,1}){
draw(scale(0.6)*Label("$"+(string) i+"$",Relative(0)),(0,i)-(marginx,0)--(0,i)+(marginx,0));
}
for (int i=0; i<=360; i=i+30){
draw(scale(0.6)*Label((i != 0) ? "$"+(string) i+"^{circ}$" : " ",Relative(0),black),(radians(i),0)-(0,marginy)--(radians(i),0)+(0,marginy),blue);
dot((radians(i),sinx(radians(i))), (i == 0 || i == 360) ? blue : black);
}
label("$y=sin x$" +" on " + "$[0,2pi]$", (radians(130),-1.5));


Answered by user213378 on August 29, 2020

Similar to @Torbjørn T. answer (+1):

documentclass[margin=3mm]{standalone}
usepackage{pgfplots}
usetikzlibrary{arrows.meta}

begin{document}
begin{tikzpicture}
begin{axis}[
x=0.25mm,
axis lines=middle,
axis line style={Latex-Latex},
xlabel=$x$, xlabel style={anchor=west},
ylabel=$y$, ylabel style={anchor=south},
%
xmin=-25,   xmax=380,
ymin=-1.25, ymax=1.25,
ticklabel style = {font=footnotesize},
xtick distance=30,
samples at={0,30,...,360},
smooth
]
node[above right] at (30,-1) {$y=sin(x)$};
end{axis}
end{tikzpicture}
end{document}


Answered by Zarko on August 29, 2020