pyplot和semilogarithmic scale:如何用变换绘制圆

时间:2013-09-24 15:42:57

标签: matplotlib geometry logarithm

我想在使用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坐标的正确值,但圆圈再次拉伸并切成两半。

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

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

1 个答案:

答案 0 :(得分:2)

最简单的方法可能是使用情节标记而不是Circle。例如:

ax.plot(x,y,marker='o',ms=x*5,mfc=(1.,0.,0.,0.5),mec='None')

这将为您提供一个始终为“圆形”并且将以正确的x,y坐标为中心的圆,尽管其大小与x和y标度无关。如果您只关心中心位置,那么您可以使用ms=,直到看起来正确。

更常见的方法是为圆圈构建一个新的复合变换 - 你应该看一下this tutorial on transformations。基本上,从图形到数据空间的转换是这样构造的:

transData = transScale + (transLimits + transAxes)

其中transScale处理数据的任何非线性(例如对数)缩放,transLimits将数据的x和y限制映射到轴的单位空间,transAxes将轴边界框的角映射到显示空间。

您希望保持圆形看起来像圆/椭圆(即根据x轴的对数缩放不扭曲它),但您仍希望将其转换为数据坐标中的正确中心位置。为此,您可以构建缩放的翻译,然后将其与transLimitstransAxes结合使用:

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轴上的缩放会有点奇怪和随意 - 你需要玩弄你如何构建转换以获得你想要的。