我正在尝试在python中的形状文件上进行热图绘制。我需要做很多这样的事情,所以不想每次都读.shp。
相反,我认为我可以创建 map 边界的lineCollection实例并覆盖两个图像。问题是-我似乎无法使两者正确对齐。
这是代码,其中linecol是lineCollection对象。
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,但似乎无法管理它。
非常感谢您的帮助!
最佳答案
由于涉及各种坐标系,因此转换非常棘手。参见http://matplotlib.sourceforge.net/users/transforms_tutorial.html。
我设法像这样将LineCollection
缩放到适当的大小。关键是要意识到我需要将+ ax.transData
添加到在LineCollection
上设置的新转换中。 (当您未在艺术家对象上设置任何变换时,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()
(输出在这里:http://i.stack.imgur.com/hDNN8.png没有足够的声誉才能发布内联。)
如果您需要在x和y上平移或缩放不等的形状,则修改此内容应该很容易。
关于python - 在matplotlib中的图上覆盖lineCollection-如何使两者对齐。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7904199/