繁体   English   中英

如何在python的极坐标图中绘制圆圈

[英]How to plot circles in polar plot in python

我有一个带有xyzr坐标(笛卡尔)的列表。 我需要在极坐标图中绘制一些圆圈,但我不知道如何使用笛卡尔坐标进行绘制。

我正在尝试用这条线来做

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

但这似乎不起作用,因为我得到的圆圈离原点中心太远了。

有什么帮助吗?

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

您应该使用 azvoids 和 rvoids 来绘制圆心,因为您使用它们在散点图中显示 tham

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

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM