elenafer
elenafer

Reputation: 55

How to plot circles in polar plot in python

I have a list with x,y,z, r coordinates (cartesians). I need to plot some circles in a polar plot, but I don't know how to do it with cartesians coordinates.

I am trying to do it with this line

circle1 = plt.Circle((x[i], y[i]), r[i], transform=ax3.transData._b, color = 'r', alpha=0.5, fill=False)

but this doesn't seem to work because I obtain the circles too far away from the center of the origin.

any help?

data1 = pd.read_csv('Uchuu_lightcone_0_11.9_voids.txt', sep='\s+', header=None)
data1 = pd.DataFrame(data1)

x = data1[0]
y = data1[1]
r = data1[3]
z = data1[2]
azvoids, elvoids, rvoids = cart2sph(x,y,z)
d = ax3.scatter(azvoids, rvoids, s=3, c='red', alpha=1, marker='.')
for i in range(len(x)):
    if elvoids[i] > 35 and elvoids[i] < 45:
        circle1 = plt.Circle((x[i], y[i]), r[i], transform=ax3.transData._b, color = 'r', alpha=0.5, fill=False)
        ax3.add_artist(circle1)


#  The cart2sph function is

def cart2sph(x,y,z):
    """ x, y, z :  ndarray coordinates
        ceval: backend to use: 
              - eval :  pure Numpy
              - numexpr.evaluate:  Numexpr """
    azimuth = arctan2(y,x)*180/math.pi
    xy2 = x**2 + y**2
    elevation = arctan2(z, sqrt(xy2))*180/math.pi
    r = sqrt(xy2 + z**2)
    return azimuth, elevation, r

Upvotes: 1

Views: 334

Answers (1)

ymmx
ymmx

Reputation: 4967

You should use azvoids and rvoids to plot the center of the circle since you use those to show tham in the scatter plot

import  math
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as transforms

def cart2sph(x, y, z):
    """ x, y, z :  ndarray coordinates
        ceval: backend to use:
              - eval :  pure Numpy
              - numexpr.evaluate:  Numexpr """
    azimuth = np.arctan2(y, x) * 180 / math.pi
    xy2 = x ** 2 + y ** 2
    elevation = np.arctan2(z, np.sqrt(xy2)) * 180 / math.pi
    r = np.sqrt(xy2 + z ** 2)
    return azimuth, elevation, r

#
# data1 = pd.read_csv('Uchuu_lightcone_0_11.9_voids.txt', sep='\s+', header=None)
# data1 = pd.DataFrame(data1)

N=100
x = (np.random.rand(N)-0.5)*100
y = (np.random.rand(N)-0.5)*100
z = (np.random.rand(N)-0.5)*100
r = np.random.rand(N)*10
azvoids, elvoids, rvoids = cart2sph(x, y, z)
fig = plt.figure()
ax3 = plt.subplot(111 )
d = plt.scatter(azvoids, elvoids, s=3 , c='red', alpha=1, marker='.' )
for i in range(len(x)):
    if elvoids[i] > 35 and elvoids[i] < 45:
        # circle1 = plt.Circle((azvoids[i], elvoids[i]), rvoids[i], color='r', alpha=0.5, fill=False)

        x, y =  ax3.transData.transform((azvoids[i], elvoids[i]))
        trans = (fig.dpi_scale_trans +
                 transforms.ScaledTranslation(azvoids[i], elvoids[i], ax3.transData))
        circle1 = plt.Circle((azvoids[i], elvoids[i]), rvoids[i]  , color='r', alpha=0.5, fill=None)
        ax3.add_artist(circle1)

plt.axis('equal')
plt.show()
#  The cart2sph function is

enter image description here

Upvotes: 1

Related Questions