在matplotlib中将lineCollection叠加到绘图上——如何对齐二者。

6 投票
1 回答
2082 浏览
提问于 2025-04-17 05:02

我正在尝试在Python中对一个形状文件做热力图。我需要做很多这样的图,所以不想每次都读取.shp文件。

于是,我想创建一个线集合(lineCollection)来表示地图的边界,然后把这两个图叠加在一起。问题是——我似乎无法让这两个图正确对齐。

这里是代码,linecol就是那个线集合对象。

fig = plt.figure()
ax = fig.add_subplot(111)
ax.contourf(xi,yi,zi)
ax.add_collection(linecol, autolim = False)
plt.show()

有没有简单的方法可以让linecol的范围和另一个图的范围匹配?我试过使用set_xlim和transforms.Bbox,但就是搞不定。

非常感谢你的帮助!

1 个回答

3

变换(Transforms)比较复杂,因为涉及到不同的坐标系统。你可以查看这个链接了解更多信息:http://matplotlib.sourceforge.net/users/transforms_tutorial.html.

我成功地把一个 LineCollection 按照合适的大小进行了缩放。关键在于我意识到需要在我设置的新变换上加上 + ax.transData。 (如果你没有在艺术对象上设置任何变换,ax.transData 就是默认的。它的作用是把数据坐标转换成显示坐标。)

from matplotlib import cm
import matplotlib.pyplot as plt
import matplotlib.collections as mc
import matplotlib.transforms as tx
import numpy as np

fig = plt.figure()

# Heat map spans 1 x 1.
ax = fig.add_subplot(111)
xs = ys = np.arange(0, 1.01, 0.01)
zs = np.random.random((101,101))
ax.contourf(xs, ys, zs, cmap=cm.autumn)

lines = mc.LineCollection([[(5,1), (9,5), (5,9), (1,5), (5,1)]])
# Shape spans 10 x 10. Resize it to 1 x 1 before applying the transform from
# data coords to display coords.
trans = tx.Affine2D().scale(0.1) + ax.transData
lines.set_transform(trans)
ax.add_collection(lines)

plt.show()

(输出在这里:https://i.stack.imgur.com/hDNN8.png 因为声望不够,无法直接发布。)enter image description here

如果你需要在 x 和 y 方向上进行不等的平移或缩放,修改这个应该很简单。

撰写回答