绘制显示圆的方程式

15
以下公式用于对来自二维空间的点进行分类:
f(x1,x2) = np.sign(x1^2+x2^2-.6)

所有点都在空间中 X = [-1,1] x [-1,1],每个x的选择具有均匀概率。

现在我想要可视化等于以下圆形:

0 = x1^2+x2^2-.6

x1的值应该在x轴上,x2的值应该在y轴上。

理论上是可以的,但是我很难将方程转化为图表。


可能是重复的问题:如何在平面上绘制2个变量 - Bas Jansen
5个回答

18
你可以使用轮廓图,如下所示(基于 http://matplotlib.org/examples/pylab_examples/contour_demo.html 的示例):
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1.0, 1.0, 100)
y = np.linspace(-1.0, 1.0, 100)
X, Y = np.meshgrid(x,y)
F = X**2 + Y**2 - 0.6
plt.contour(X,Y,F,[0])
plt.show()

这产生了以下图形

enter image description here

最后,一些常规声明:

  1. x^2在Python中不意味着你所想象的那样,你必须使用x**2
  2. x1x2对我来说非常误导人,特别是如果你声明x2必须在y轴上。
  3. (感谢Dux)您可以添加plt.gca().set_aspect('equal') 来使图形实际上看起来圆形,通过使轴相等。

我有点尴尬,没想到这个... 这是一个更好的解决方案! - Dux
谢谢。这似乎是一种简单明了的方法。 当我尝试发布问题时,使用 '**' 改变了文本的输出。 - Elyakim
2
在调用 plt.show() 之前使用 plt.gca().set_aspect('equal') 来实现一个圆形的圆形。 - Dux
1
这不是画圆的一种非常低效的方式吗?你需要创建两个10000个变量的网格,然后在其上运行轮廓算法。请查看我的答案以获取另一种方法。 - hitzg
@hitzg 你说得对。然而,我认为当有人提出绘图问题时,性能并不是一个很大的问题(除非他们的代码包含 savefig)。因此,我选择了这个选项,因为(在我看来)它是一种相当容易理解的方法。 - Bas Jansen
显示剩余4条评论

16

@BasJansen的解决方案肯定能让你达到目的,但如果你使用许多网格点则会非常低效,或者如果你只使用几个网格点,则会不准确。

你可以直接画出圆形。鉴于 0 = x1**2 + x**2 - 0.6,因此可以得出 x2 = sqrt(0.6 - x1**2)(如Dux所述)。

但实际上,你想要做的是将笛卡尔坐标转换为极坐标。

x1 = r*cos(theta)
x2 = r*sin(theta)

如果您在圆方程中使用这些替换,您将看到r = sqrt(0.6)

现在您可以在绘图中使用它:

import numpy as np
import matplotlib.pyplot as plt

# theta goes from 0 to 2pi
theta = np.linspace(0, 2*np.pi, 100)

# the radius of the circle
r = np.sqrt(0.6)

# compute x1 and x2
x1 = r*np.cos(theta)
x2 = r*np.sin(theta)

# create the figure
fig, ax = plt.subplots(1)
ax.plot(x1, x2)
ax.set_aspect(1)
plt.show()

结果:

输入图片描述


1
这难道不正是与@Bas Jansen或我的答案中绘制x1x2一样有效吗?因为您仍然在笛卡尔坐标系上绘图,这些点之间的插值将是线性而不是曲线。您只是展示了一种可能更优雅的计算圆上点的方法... - Dux
所有解决方案在绘制圆形时具有相同的效率。然而,@Bas Jansen的答案在创建数据方面非常低效。您的解决方案与我的非常相似,唯一的区别在于我的解决方案中点(构成圆形)是等距离的。当您显示点(使用plt.plot(x, y, '.')ax.set_aspect(1))时,您将看到差异。 - hitzg
你尝试过用你的方法来闭合循环吗? - hitzg

5

使用复数绘制圆形

思路:将点乘以复指数(enter image description here)可以将该点在圆上旋转

import numpy as np import matplotlib.pyplot as plt

导入numpy和matplotlib.pyplot库:

num_pts=20 # number of points on the circle
ps = np.arange(num_pts+1)
# j = np.sqrt(-1)
pts = np.exp(2j*np.pi/num_pts *(ps))

fig, ax = plt.subplots(1)
ax.plot(pts.real, pts.imag , '-o')
ax.set_aspect(1)
plt.show()

enter image description here


5
如何绘制x值并计算相应的y值?
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100, endpoint=True)
y = np.sqrt(-x**2. + 0.6)

plt.plot(x, y)
plt.plot(x, -y)

产生

在这里输入图片描述

这显然可以做得更好,但这只是为了演示...


5
# x**2  + y**2 = r**2
r = 6
x = np.linspace(-r,r,1000)
y = np.sqrt(-x**2+r**2)
plt.plot(x, y,'b')
plt.plot(x,-y,'b')
plt.gca().set_aspect('equal')
plt.show()

生成:

在这里输入图片描述


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