首页 > 解决方案 > 如何使用底图在点上创建轮廓?

问题描述

有一个带有 x,y 地理坐标值的表“tempcc”(不知道在此处附加文件,我的 csv 中有 86 行):

         X       Y      Temp
0   35.268  55.618  1.065389
1   35.230  55.682  1.119160
2   35.508  55.690  1.026214
3   35.482  55.652  1.007834
4   35.289  55.664  1.087598
5   35.239  55.655  1.099459
6   35.345  55.662  1.066117
7   35.402  55.649  1.035958
8   35.506  55.643  0.991939
9   35.526  55.688  1.018137
10  35.541  55.695  1.017870
11  35.471  55.682  1.033929
12  35.573  55.668  0.985559
13  35.547  55.651  0.982335
14  35.425  55.671  1.042975
15  35.505  55.675  1.016236
16  35.600  55.681  0.985532
17  35.458  55.717  1.063691
18  35.538  55.720  1.037523
19  35.230  55.726  1.146047
20  35.606  55.707  1.003364
21  35.582  55.700  1.006711
22  35.350  55.696  1.087173
23  35.309  55.677  1.088988
24  35.563  55.687  1.003785
25  35.510  55.764  1.079220
26  35.334  55.736  1.119026
27  35.429  55.745  1.093300
28  35.366  55.752  1.119061
29  35.501  55.745  1.068676
..     ...     ...       ...
56  35.472  55.800  1.117183
57  35.538  55.855  1.134721
58  35.507  55.834  1.129712
59  35.256  55.845  1.211969
60  35.338  55.823  1.174397
61  35.404  55.835  1.162387
62  35.460  55.826  1.138965
63  35.497  55.831  1.130774
64  35.469  55.844  1.148516
65  35.371  55.510  0.945187
66  35.378  55.545  0.969400
67  35.456  55.502  0.902285
68  35.429  55.517  0.925932
69  35.367  55.710  1.090652
70  35.431  55.490  0.903296
71  35.284  55.606  1.051335
72  35.234  55.634  1.088135
73  35.284  55.591  1.041181
74  35.354  55.587  1.010446
75  35.332  55.581  1.015004
76  35.356  55.606  1.023234
77  35.311  55.545  0.997468
78  35.307  55.575  1.020845
79  35.363  55.645  1.047831
80  35.401  55.628  1.021373
81  35.340  55.629  1.045491
82  35.440  55.643  1.017227
83  35.293  55.630  1.063910
84  35.370  55.623  1.029797
85  35.238  55.601  1.065699

我尝试使用以下方法创建等值线:

from numpy import meshgrid,linspace
data=tempcc
m = Basemap(lat_0 = np.mean(tempcc['Y'].values),\
            lon_0 = np.mean(tempcc['X'].values),\
            llcrnrlon=35,llcrnrlat=55.3, \
            urcrnrlon=35.9, urcrnrlat=56.0, resolution='l')

x = linspace(m.llcrnrlon, m.urcrnrlon, data.shape[1])
y = linspace(m.llcrnrlat, m.urcrnrlat, data.shape[0])
xx, yy = meshgrid(x, y)
m.contour(xx, yy, data,latlon=True)
#pt.legend()
m.scatter(tempcc['X'].values, tempcc['Y'].values, latlon=True)
#m.contour(x,y,data,latlon=True)

但我无法正确管理,尽管一切似乎都很好。据我了解,我必须制作一个二维值矩阵,其中 i 是 lat,j 是 lon,但我找不到这个例子。 我得到的结果

如您所见,区域是正确的,但插值不好。

怎么了?我忘记了哪个参数?

标签: pythonmatplotlib-basemap

解决方案


您可以使用三角测量,然后调用 tricontour() 而不是 contour()

import matplotlib.pyplot as plt
from matplotlib.tri import Triangulation
from mpl_toolkits.basemap import Basemap
import numpy
m = Basemap(lat_0 = np.mean(tempcc['Y'].values),
            lon_0 = np.mean(tempcc['X'].values),
            llcrnrlon=35,llcrnrlat=55.3,
            urcrnrlon=35.9, urcrnrlat=56.0, resolution='l')
triMesh = Triangulation(tempcc['X'].values, tempcc['Y'].values)
tctr = m.tricontour(triMesh, tempcc['Temp'].values,
                    levels=numpy.linspace(min(tempcc['Temp'].values),
                                          max(tempcc['Temp'].values), 7),
                    latlon=True)

推荐阅读