将matplotlib数据单位转换为标准单位
有没有人知道怎么把matplotlib的数据单位转换成标准化单位?
我需要这样做是因为我想在一个图上面再画一个子图。
而默认的写法:
plt.axes([0.1,0.1,0.3,0.3])
需要用标准化的坐标,但我想用数据坐标:
比如这段代码:
plt.plot([0,2],[2,4]);
plt.axes([0.3,.3,0.4,.4])
生成了这个效果:
但我希望能用数据坐标来定义子图的位置,比如像这样:[0.7,2.5,1.7,3.5]。我试着调整了axes.transData、axes.get_transform()之类的,但没找到合适的函数来实现这个功能。
1 个回答
13
这里有一种方法可以实现:
内部的 axes
在外部 axes
坐标系中的位置是 0.5, 2.5, 1.0, 0.3
。
你基本上需要进行两个转换——一个是从源坐标到显示坐标,另一个是从显示坐标到目标坐标。从文档来看,似乎没有直接的方法可以做到这一点:
http://matplotlib.org/users/transforms_tutorial.html
bb_data = Bbox.from_bounds(0.5, 2.5, 1.0, 0.3)
disp_coords = ax.transData.transform(bb_data)
fig_coords = fig.transFigure.inverted().transform(disp_coords)
ax
和 fig
都自带一个转换器——用于显示坐标!
如果你对它们调用 inverted
,你就能得到一个用于反向转换的转换器。
下面是上面例子的完整代码:
import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox
plt.plot([0,2], [2,4])
fig = plt.gcf()
ax = plt.gca()
bb_data = Bbox.from_bounds(0.5, 2.5, 1.0, 0.3)
disp_coords = ax.transData.transform(bb_data)
fig_coords = fig.transFigure.inverted().transform(disp_coords)
fig.add_axes(Bbox(fig_coords))
plt.show()