在matplotlib中将lineCollection叠加到绘图上——如何对齐二者。
我正在尝试在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 因为声望不够,无法直接发布。)
如果你需要在 x 和 y 方向上进行不等的平移或缩放,修改这个应该很简单。