I was trying to plot a rose curve in python with the following code:
import numpy as np
from matplotlib import pyplot as plt
theta = np.linspace(0, 2*np.pi, 1000)
r = 3* np.sin(8 * theta)
plt.polar(theta, r, 'r')
plt.show()
Now this is the rose curve $r = 3 \sin{8\theta}$
, where since $8$
is even so the curve should have $2.8 = 16$
petals. But the output gives me a rose with $8$ petals.
I'm not sure if python understands the mathematical definition of the rose curve or we modified our definition so that Python understands it. How can I get the output I desire?
Your problem is similar to the problem encountered in this related question: Polar plot of a function with negative radii using matplotlib
The problem is that matplotlib.pyplot.polar
does not plot a curve in polar coordinates the way a mathematician would expect it.
A mathematician would expect that a radius of 0 designates the origin, and a negative radius is reflected across the origin; in particular, the polar coordinates (r, t)
and (-r, t+pi)
should designate the same point.
You can force this behaviour by manually adding pi
to theta
when r
is negative, and replace r
with its absolute value.
import numpy as np
from matplotlib import pyplot as plt
theta = np.linspace(0, 2*np.pi, 1000)
r = 3* np.sin(8 * theta)
# plt.polar(theta, r, 'r') # remove this line
plt.polar(theta+(r<0)*np.pi, np.abs(r), 'r')
plt.show()