我正在尝试在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没有足够的声誉才能发布内联。)
python - 在matplotlib中的图上覆盖lineCollection-如何使两者对齐。-LMLPHP

如果您需要在x和y上平移或缩放不等的形状,则修改此内容应该很容易。

关于python - 在matplotlib中的图上覆盖lineCollection-如何使两者对齐。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7904199/

10-11 15:46