【问题标题】:Plot Ellipse with matplotlib.pyplot (Python)用 matplotlib.pyplot (Python) 绘制椭圆
【发布时间】:2020-10-19 13:58:17
【问题描述】:

对不起,如果这是一个愚蠢的问题,但是有没有一种简单的方法可以在 Python 中用matplotlib.pyplot 绘制一个椭圆?我希望会有类似于matplotlib.pyplot.arrow 的东西,但我找不到任何东西。

是使用matplotlib.patchesdraw_artist 或类似方法的唯一方法吗?我希望有一个更简单的方法,但是文档并没有提供太多帮助。

【问题讨论】:

  • 完全同意。对于如此简单的事情,这不是一个合理的抽象级别。

标签: python matplotlib ellipse


【解决方案1】:

matplotlib 椭圆演示很好。但是如果没有 for 循环,我无法在我的代码中实现它。我得到一个轴图错误。这是我所做的,当然 xy 中心是我自己的坐标,其宽度和高度基于我绘制椭圆的图像。

from matplotlib.patches import Ellipse

plt.figure()
ax = plt.gca()

ellipse = Ellipse(xy=(157.18, 68.4705), width=0.036, height=0.012, 
                        edgecolor='r', fc='None', lw=2)
ax.add_patch(ellipse)

此代码部分基于this page 上的第一个代码框。请参阅上面 Chris 的回复以获取指向 matplotlib.patches.Ellipse 的链接。

【讨论】:

  • 这对于快速绘图特别有用(当您宁愿使用 plt.plot/scatter 等,而不是创建子图的轴时)。请注意,除非您设置 xlim/ylim,否则您将很难找到演示的椭圆;)
【解决方案2】:

如果不想使用补丁,可以使用椭圆的参数方程:

x = u + a cos(t) ; y = v + b sin(t)

import numpy as np
from matplotlib import pyplot as plt
from math import pi

u=1.     #x-position of the center
v=0.5    #y-position of the center
a=2.     #radius on the x-axis
b=1.5    #radius on the y-axis

t = np.linspace(0, 2*pi, 100)
plt.plot( u+a*np.cos(t) , v+b*np.sin(t) )
plt.grid(color='lightgray',linestyle='--')
plt.show()

这给出了:

椭圆可以通过二维旋转矩阵进行旋转:

import numpy as np
from matplotlib import pyplot as plt
from math import pi, cos, sin

u=1.       #x-position of the center
v=0.5      #y-position of the center
a=2.       #radius on the x-axis
b=1.5      #radius on the y-axis
t_rot=pi/4 #rotation angle

t = np.linspace(0, 2*pi, 100)
Ell = np.array([a*np.cos(t) , b*np.sin(t)])  
     #u,v removed to keep the same center location
R_rot = np.array([[cos(t_rot) , -sin(t_rot)],[sin(t_rot) , cos(t_rot)]])  
     #2-D rotation matrix

Ell_rot = np.zeros((2,Ell.shape[1]))
for i in range(Ell.shape[1]):
    Ell_rot[:,i] = np.dot(R_rot,Ell[:,i])

plt.plot( u+Ell[0,:] , v+Ell[1,:] )     #initial ellipse
plt.plot( u+Ell_rot[0,:] , v+Ell_rot[1,:],'darkorange' )    #rotated ellipse
plt.grid(color='lightgray',linestyle='--')
plt.show()

返回:

【讨论】:

    【解决方案3】:

    你见过matplotlib ellipse demo吗?他们在这里使用matplotlib.patches.Ellipse

    【讨论】:

    • 我希望有更接近标准绘图方法的东西,但接下来我会研究这个。谢谢!
    • 刚刚注意到您在 matplotlib.pyplot 中寻找一些东西。抱歉,一开始没注意到。搜索matplotlib.pyplot API 文档并没有发现任何信息,所以恐怕你不得不忍受使用matplotlib.patches.Ellipse
    • 谢谢,看来这就是我必须做的。我本来希望 pyplot 包含一些基本的形状绘图功能,但我想一个人不可能拥有一切!
    • @Casper 如果您知道椭圆的原点和长轴/短轴,您可以简单地在轨道上生成点。根本不需要补丁。
    • 在仔细查看 matplotlib.patches 之后,我意识到这是最简单的解决方案。该演示非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多