1

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

我愿意:

ax = plt.axes()

point1 = plt.Circle((x,y), x, color='r',clip_on=False, 
                    transform = ax.transAxes, alpha = .5)

plt.xscale('log')

current_fig = plt.gcf()

current_fig.gca().add_artist(point1)

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

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

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

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

4

1 回答 1

4

可能最简单的方法是使用绘图标记而不是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 轴的对数缩放对其进行扭曲),但您仍希望将其转换为数据坐标中的正确中心位置。为了做到这一点,您可以构建一个缩放的翻译,然后将它与transLimitsand结合起来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 轴上的缩放会有点奇怪和随意——你需要尝试如何构建转换才能得到你想要的。

于 2013-09-24T22:23:04.850 回答