将matplotlib数据单位转换为标准单位

7 投票
1 回答
2782 浏览
提问于 2025-04-17 13:58

有没有人知道怎么把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)

axfig 都自带一个转换器——用于显示坐标!
如果你对它们调用 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()

撰写回答