用Python创建2D网格

5

我对编程非常新手...

但这是我的问题:

我无法发布图片,但我希望拥有的绘图是一个“皇冠”(两个半径为a的同心圆), 从数学上讲很容易定义,但我该如何使用Python程序实现呢?

我想到了这样一个方法:

def Fm1(X, Y):
    r =r = sqrt(1.*X**2+1.*Y**2)
    cos = 1.*X/r
    sin = 1.*Y/r
    teta = where( sin >= 0. , arccos(cos) , -arccos(cos) )
    teta = where(r == 0. , 0., teta)
    return r, teta


def F(r,teta):                                                                  
    X = r*cos(teta)                                                             
    Y = r*sin(teta)                                                             
    return X,Y

那些只是让你从笛卡尔坐标系转换到极坐标系的功能,然后:
r=sy.linspace(a,b,N+1) # radius division
t=sy.linspace(0,2.*pi,2**NN) #angle (theta) division
R,T=meshgrid(r,t) #creating a mesh

X,Y = F(R,T)#transform from polar to cartesian

#Plotting :
fig=plt.figure()
ax=fig.add_subplot(111)                                 
ax.plot(X, Y)
plt.show()

但结果是:同心多边形。我希望从半径a到半径b有N+1个等距圆,并且有2 ** NN条线段(原点中心和给定角度)。抱歉,我知道这是一个非常琐碎的问题,谢谢。

你使用了一些我不熟悉的函数。whereonesFcm1meshgridFc 是什么? - Kevin
此外,我很难想象您试图绘制的形状。外圆和内圆的半径不同,对吗?因此,定义皇冠所需的不仅仅是 a - Kevin
@Kevin,其中大部分是numpy函数,我认为其余的是打字错误。 - tacaswell
我修改了代码,按照我最初的想法进行了更改。这样更加简洁。抱歉。是的,你需要两个半径。 - lasofivec
我为 matplotlib 添加了一个标签,以及它的子集函数 pylab - Geoff
1个回答

4

在我的回答中,我将使用两个库

import numpy as np
import pylab

我相信这些是您设置中的常量:
r_a = 0.50
r_b = 0.75
circles = 6  
lines   = 50
origin = (0, 0)

选项1:直接绘图

首先,画出圆形

for r in np.linspace(r_a, r_b, circles):
    pylab.gca().add_patch(pylab.Circle(origin, radius=r, 
                                       fill=False, color='black'))

然后画出线条

r_ab = np.array([r_a, r_b])
for theta in np.linspace(0, 2 * np.pi, lines):
    pylab.plot(np.cos(theta) * r_ab,
               np.sin(theta) * r_ab, color='red')

最后,显示
pylab.axis('scaled')
pylab.show()
结果:

绘图图像

选项2:绘制线段:

(在导入库和设置常量之后)首先计算点的位置

r,t   = np.meshgrid(np.linspace(r_a, r_b, circles),
                    np.linspace(0, 2 * np.pi, lines))
x = r * np.cos(t)
y = r * np.sin(t)

然后按照常规方法绘制圆圈,并绘制线条

# Plot circles
pylab.plot(x, y)
# Plot lines (first and last x and y of each theta)
pylab.plot(np.vstack((x[:,0], x[:, -1])),
           np.vstack((y[:,0], y[:, -1])))

最后,显示
pylab.axis('scaled')
pylab.show()
结果

第二种选择的结果

注意:在所有这些操作之后,我认为您真正需要的只是选项2中有关绘制线条的最后一点内容。我将保留所有其他答案,并为任何未来的读者提供。


几乎!这些线条应该从半径为r_a的圆与交点开始。因此,对于这些线条,代码应该像这样:for theta in np.linspace(0, 2 * np.pi, lines): pylab.plot(( np.cos(theta) * r_a , np.cos(theta) * r), ( np.sin(theta) * r_a, np.sin(theta) * r), 'red') - lasofivec
但我的主要问题不是制作图形,而是拥有一个包含这些点的网格(因此我想我在帖子中描述的矩阵应该没问题),并验证我拥有哪些点。我想要像你展示的那样的图形!因此,从一个包含所有网格点的矩阵中是否可能得到像上面那样的图形? - lasofivec
我更新了我的图片和代码,按照你在第一条评论中指示的方式显示了轮子。从你的第二条评论中,我仍然不清楚你想要什么。你正在正确地对一堆同心圆进行子采样。问题是连接你的点的线段是直线而不是适合圆形的吗?绘制网格将始终导致直线。 - Geoff
1
这正是我所需要的,谢谢! :) 由于变换的雅可比矩阵在原点具有奇异点,我需要一个带有2个补丁的网格,因此这是外部补丁。现在我的运行程序已经拥有了两个补丁,所以谢谢! - lasofivec
太好了。很高兴这是你需要的。 - Geoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接