可能最简单的方法是使用绘图标记而不是Circle
. 例如:
ax.plot(x,y,marker='o',ms=x*5,mfc=(1.,0.,0.,0.5),mec='None')
这将为您提供一个始终看起来“圆形”的圆,并将以正确的 x,y 坐标为中心,尽管它的大小与 x 和 y 比例无关。如果你只关心中心位置,那么你可以乱来,ms=
直到它看起来正确。
一个更通用的方法是为圆构造一个新的复合变换——你应该看看这个关于变换的教程。基本上,从图形到数据空间的转换是这样构造的:
transData = transScale + (transLimits + transAxes)
wheretransScale
处理数据的任何非线性(例如对数)缩放,将数据transLimits
的 x 和 y 限制映射到轴的单位空间,并将transAxes
轴边界框的角映射到显示空间。
您希望使圆看起来像一个圆/椭圆(即不根据 x 轴的对数缩放对其进行扭曲),但您仍希望将其转换为数据坐标中的正确中心位置。为了做到这一点,您可以构建一个缩放的翻译,然后将它与transLimits
and结合起来transAxes
:
from matplotlib.transforms import ScaledTranslation
ax = plt.axes(xscale='log')
x,y = 10,0
ax.set_ylim(-11,11)
ax.set_xlim(1E-11,1E11)
# use the axis scale tform to figure out how far to translate
circ_offset = ScaledTranslation(x,y,ax.transScale)
# construct the composite tform
circ_tform = circ_offset + ax.transLimits + ax.transAxes
# create the circle centred on the origin, apply the composite tform
circ = plt.Circle((0,0),x,color='r',alpha=0.5,transform=circ_tform)
ax.add_artist(circ)
plt.show()
显然,x 轴上的缩放会有点奇怪和随意——你需要尝试如何构建转换才能得到你想要的。