如何用python matplotlib.patches.ellipse给椭圆添加轴线?

kninwzqo  于 2023-01-13  发布在  Python
关注(0)|答案(1)|浏览(203)

我有一个简单的代码可以生成一个椭圆

import matplotlib.patches as patches
import matplotlib.pyplot as plt

fig, ax = plt.subplots(subplot_kw={'aspect': 'equal'})

ellipse = patches.Ellipse((0, 0), 4, 2, angle=45, fill=False)
ax.add_artist(ellipse)

ax.set_xlim(-2.2, 2.2)
ax.set_ylim(-2.2, 2.2)

plt.show()

这是当前输出:ellipse
我需要添加椭圆的轴,这样它看起来就像这样:ellipse_output
有办法做到这一点吗?我需要一个通用的方法来使用更复杂的椭圆,谢谢。
我试着在面片中搜索参数。Ellipse()来绘制那些轴线,但是什么也没找到。

iswrvxsc

iswrvxsc1#

可以添加椭圆的长轴和短轴。
在我展示的代码中,我做了主轴,但是你需要处理Angular 部分(基于椭圆的点),而我只是把它设置为45度来发布一个快速的答案。
这样做的结果将给予完整的解决方案。
所以,我做了这样的事情:

import matplotlib.patches as patches
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(subplot_kw={'aspect': 'equal'})
#################################
# you need to figure this bit out
#################################

ellipse = patches.Ellipse((0, 0), 4, 2, angle=45, fill=False)
ax.add_artist(ellipse)

ellipse.set_clip_box(ax.bbox)
ellipse.set_alpha(0.1)
ax.annotate("",
            xy=(ellipse.center[0], ellipse.center[1] - ellipse.height / 2),
            xytext=(ellipse.center[0], ellipse.center[1] + ellipse.height / 2),
            arrowprops=dict(arrowstyle="<->", color="black"))
ax.annotate("",
            xy=(ellipse.center[0] - ellipse.width / 2, ellipse.center[1]),
            xytext=(ellipse.center[0] + ellipse.width / 2, ellipse.center[1]),
            arrowprops=dict(arrowstyle="<->", color="black"))
ax.annotate("",
            xy=(ellipse.center[0] - ellipse.width / 2 * np.cos(np.deg2rad(ellipse.angle)), 
                ellipse.center[1] - ellipse.height / 2 * np.sin(np.deg2rad(ellipse.angle))),
            xytext=(ellipse.center[0] + ellipse.width / 2 * np.cos(np.deg2rad(ellipse.angle)), 
                    ellipse.center[1] + ellipse.height / 2 * np.sin(np.deg2rad(ellipse.angle))),
            arrowprops=dict(arrowstyle="<->", color="black"))

ax.set_xlim(-2.2, 2.2)
ax.set_ylim(-2.2, 2.2)

plt.show()

这就给你留下了这样一个情节:

总的来说,注解行基本上允许您完成所需的最后几位。
编辑:我可以简化为:

import matplotlib.patches as patches
import matplotlib.pyplot as plt

fig, ax = plt.subplots(subplot_kw={'aspect': 'equal'})

# patches.Ellipse(center, width, height, angle)
ellipse = patches.Ellipse((0, 0), 4, 2, angle=45, fill=False)
ax.add_artist(ellipse)

ellipse.set_clip_box(ax.bbox)

ax.annotate("",
            xy=(ellipse.center[0] - ellipse.width+2 , 
                ellipse.center[1] - ellipse.height ),
            xytext=(ellipse.center[0] + ellipse.width-1, 
                    ellipse.center[1] + ellipse.height+1),
            arrowprops=dict(arrowstyle="<->", color="red"))
ax.set_xlim(-2.2, 2.2;)
ax.set_ylim(-2.2, 2.2)

plt.show()

看起来像这样

相关问题