Matplotlib pyplot和半对数比例:如何使用变换绘制圆

Matplotlib pyplot和半对数比例:如何使用变换绘制圆,matplotlib,geometry,logarithm,Matplotlib,Geometry,Logarithm,我想在用pyplot绘制的图中画一个圆,但我需要在x轴上使用对数刻度 我有: 如你所见,我希望圆的半径等于x坐标 我的问题是,如果我像这里写的那样使用,transAxes,那么我得到的圆实际上是一个圆(否则它在x上拉伸,看起来像一个切成两半的椭圆),但是x坐标是0。另一方面,如果我使用transData而不是transAxes,那么我得到了x坐标的正确值,但圆再次拉伸并切成两半 我真的不介意拉伸,但我不喜欢切割,我希望它至少是一个完整的椭圆 知道如何获得我想要的吗?最简单的方法可能是使用绘图标记

我想在用pyplot绘制的图中画一个圆,但我需要在x轴上使用对数刻度

我有:

如你所见,我希望圆的半径等于x坐标

我的问题是,如果我像这里写的那样使用,
transAxes
,那么我得到的圆实际上是一个圆(否则它在x上拉伸,看起来像一个切成两半的椭圆),但是x坐标是0。另一方面,如果我使用
transData
而不是
transAxes
,那么我得到了x坐标的正确值,但圆再次拉伸并切成两半

我真的不介意拉伸,但我不喜欢切割,我希望它至少是一个完整的椭圆


知道如何获得我想要的吗?

最简单的方法可能是使用绘图标记而不是
圆圈。例如:

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)
transScale
处理数据的任何非线性(例如对数)缩放时,
transLimits
将数据的x和y限制映射到轴的单位空间,并且
transAxes
将轴边界框的角点映射到显示空间

您希望使圆看起来像一个圆/椭圆(即,不根据x轴的对数缩放使其变形),但仍希望将其平移到数据坐标中的正确中心位置。为此,您可以构建一个缩放翻译,然后将其与
transLimits
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轴上的缩放会有点奇怪和随意——你需要仔细研究如何构造变换,才能得到你想要的

最简单的方法可能是只使用绘图标记,而不是
圆圈
。例如:

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)
transScale
处理数据的任何非线性(例如对数)缩放时,
transLimits
将数据的x和y限制映射到轴的单位空间,并且
transAxes
将轴边界框的角点映射到显示空间

您希望使圆看起来像一个圆/椭圆(即,不根据x轴的对数缩放使其变形),但仍希望将其平移到数据坐标中的正确中心位置。为此,您可以构建一个缩放翻译,然后将其与
transLimits
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轴上的缩放会有点奇怪和随意——你需要仔细研究如何构造变换,才能得到你想要的