matplotlib 在对数刻度上方绘制椭圆进行注解

9njqaruj  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(99)

使用matplotlib,我想在semilogy图上画一个椭圆。
考虑下图和相关代码。

import numpy as np
import scipy.io
from matplotlib import pyplot as plt
from matplotlib.patches import Ellipse

plt.figure(figsize=[3.3, 3.3])
plt.rcParams.update({'font.size': 8, 'text.usetex': True})

plt.semilogy([1, 2, 3, 4], [4, 8, 12, 16], color='r')
plt.semilogy([1, 2, 3, 4], [2, 4, 6, 8], color='r')
plt.semilogy([1, 2, 3, 4], [12, 15, 20, 27], color='b')

ax = plt.gca()
plt.annotate('blue curve', xy=(1.5, 22.5), xytext=(1.5, 22.5), ha='center', va='center')
plt.annotate('', xy=(2, 15), xytext=(1.5, 22), arrowprops=dict(width=0.1, headwidth=2, headlength=2, color='grey'))
plt.annotate('red curves', xy=(2.5, 22.5), xytext=(2.5, 22.5), ha='center', va='center')
plt.annotate('', xy=(3, 15), xytext=(2.5, 22), arrowprops=dict(width=0.1, headwidth=2, headlength=2, color='grey'))
ax.add_patch(Ellipse(xy=(3, 10), width=0.2, height=10, color="grey", fill=False, lw=1, zorder=5))

plt.grid()
plt.xlabel('x')
plt.ylabel('y')

plt.savefig('filename.pdf', format='pdf')

plt.show()

正如你所看到的,椭圆由于y轴上的对数刻度而变形了。我试着在自然刻度上重叠一个新的轴,我也试着从现有的问题(比如this one)中获得灵感:这两种方法都不起作用,因为不幸的是,我对python的了解接近于零。
有没有一个简单的方法来画一个(非变形)椭圆,而不修改现有的代码?

4si2a6ki

4si2a6ki1#

answer in the Q&A you linked to确实为你的问题提供了一个解决方案。你想使用那里记录的复合转换。我已经修改了你的脚本的相关部分来做到这一点。
注意事项:使用这种方法需要做的一个改变是椭圆的高度是在轴坐标中给出的(我使用了0.5的高度)而不是像你那样在数据坐标中给出的(height=10)。可能有一种方法可以通过另一种变换在数据坐标中给出,但我没有包括在这里。我还稍微移动了椭圆的中心,使其以两条红线为中心。

from matplotlib.transforms import ScaledTranslation

# Ellipse centre coordinates
x, y = 3, 8

# use the axis scale tform to figure out how far to translate 
ell_offset = ScaledTranslation(x, y, ax.transScale)

# construct the composite tform
ell_tform = ell_offset + ax.transLimits + ax.transAxes

# Create the ellipse centred on the origin, apply the composite tform
ax.add_patch(Ellipse(xy=(0, 0), width=0.2, height=0.5, color="grey", fill=False, lw=1, zorder=5, transform=ell_tform))

相关问题