【问题标题】:Plot strings of text on Basemap in place of points in Python在底图上绘制文本字符串代替 Python 中的点
【发布时间】:2015-09-22 01:59:20
【问题描述】:

我有 79 个纬度和经度,我有数据可以在 Python 的底图上绘制。我有一个包含 79 个数字的数组,我想绘制而不是普通的点(即,我希望显示“1”或“2”而不是通常的点)。我尝试了plt.annotate 函数,但没有成功。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

locs = np.genfromtxt('/Volumes/NO_NAME/Classwork/OK_vic_grid.txt')
lat = locs[:,1] # 79 values
lon = locs[:,2] # 79 values

m = Basemap(projection='stere',lon_0=-95,lat_0=35.,lat_ts=40,\
        llcrnrlat=33,urcrnrlat=38,\
        llcrnrlon=-103.8,urcrnrlon=-94) 

X,Y = m(lon,lat)    
m.drawcoastlines()
m.drawstates()
m.drawcountries()
m.drawmapboundary(fill_color='lightblue')
m.drawparallels(np.arange(0.,40.,2.),color='gray',dashes=[1,3],labels=[1,0,0,0])
m.drawmeridians(np.arange(0.,360.,2.),color='gray',dashes=[1,3],labels=[0,0,0,1])

m.scatter(X,Y)
????? (Want to plot an array "maxpc" which has 79 numbers that I want to plot the string of)

OK_vic_grid.txt:

1   33.75   -97.75
2   33.75   -97.25
3   33.75   -96.75
4   33.75   -96.25
5   33.75   -95.75
6   33.75   -95.25
7   33.75   -94.75
8   34.25   -99.75
9   34.25   -99.25
10  34.25   -98.75
11  34.25   -98.25
12  34.25   -97.75
13  34.25   -97.25
14  34.25   -96.75
15  34.25   -96.25
16  34.25   -95.75
17  34.25   -95.25
18  34.25   -94.75
19  34.75   -99.75
20  34.75   -99.25
21  34.75   -98.75
22  34.75   -98.25
23  34.75   -97.75
24  34.75   -97.25
25  34.75   -96.75
26  34.75   -96.25
27  34.75   -95.75
28  34.75   -95.25
29  34.75   -94.75
30  35.25   -99.75
31  35.25   -99.25
32  35.25   -98.75
33  35.25   -98.25
34  35.25   -97.75
35  35.25   -97.25
36  35.25   -96.75
37  35.25   -96.25
38  35.25   -95.75
39  35.25   -95.25
40  35.25   -94.75
41  35.75   -99.75
42  35.75   -99.25
43  35.75   -98.75
44  35.75   -98.25
45  35.75   -97.75
46  35.75   -97.25
47  35.75   -96.75
48  35.75   -96.25
49  35.75   -95.75
50  35.75   -95.25
51  35.75   -94.75
52  36.25   -99.75
53  36.25   -99.25
54  36.25   -98.75
55  36.25   -98.25
56  36.25   -97.75
57  36.25   -97.25
58  36.25   -96.75
59  36.25   -96.25
60  36.25   -95.75
61  36.25   -95.25
62  36.25   -94.75
63  36.75   -102.75
64  36.75   -102.25
65  36.75   -101.75
66  36.75   -101.25
67  36.75   -100.75
68  36.75   -100.25
69  36.75   -99.75
70  36.75   -99.25
71  36.75   -98.75
72  36.75   -98.25
73  36.75   -97.75
74  36.75   -97.25
75  36.75   -96.75
76  36.75   -96.25
77  36.75   -95.75
78  36.75   -95.25
79  36.75   -94.75

【问题讨论】:

  • 您的问题到底是什么?更多背景知识可能有助于找到答案。
  • @skywalker 我想在我的底图上绘制一个散点图,但不是每个纬度位置上的点,而是显示我在“maxpc”中包含的数字。跨度>
  • 你能说一下OK_vic_grid.txt吗?
  • 为什么不用热图?您真的想查看每个经度和纬度的数值吗?只是好奇。
  • @skywalker 我不熟悉热图。但是,是的,我只想要 maxpc 数组中每个纬度和经度处的数字,而不是点。

标签: python plot matplotlib-basemap


【解决方案1】:

ax.scatterax.text 都期望单个 x、y 点,而不是位置数组。

两者都可以正常工作,但您需要使用循环。

例如:

import numpy as np
import matplotlib.pyplot as plt

xy = np.random.random((5, 2))
text = ['A', 'B', 'C', 'D', 'E']

fig, ax = plt.subplots()
for (x,y), label in zip(xy, text):
    ax.text(x, y, label, ha='center', size=20)
plt.show()

使用basemap,您需要将经度和纬度投影到投影的地图坐标中(即您的XY 数组)。例如(这里我也会使用annotate 将标签偏移几个点):

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

num = 79
lat = 5 * np.random.random(num) + 33
lon = 10 * np.random.random(num) - 104

fig, ax = plt.subplots()
m = Basemap(projection='stere',lon_0=-95,lat_0=35.,lat_ts=40,
            llcrnrlat=33,urcrnrlat=38,
            llcrnrlon=-103.8,urcrnrlon=-94,
            resolution='h', ax=ax)

X,Y = m(lon,lat)
m.drawcoastlines()
m.drawstates()
m.drawcountries()
m.drawmapboundary(fill_color='lightblue')
m.drawparallels(np.arange(0.,40.,2.),color='gray',dashes=[1,3],labels=[1,0,0,0])
m.drawmeridians(np.arange(0.,360.,2.),color='gray',dashes=[1,3],labels=[0,0,0,1])

ax.scatter(X,Y)

for i, (x, y) in enumerate(zip(X, Y), start=1):
    ax.annotate(str(i), (x,y), xytext=(5, 5), textcoords='offset points')

plt.show()

另外,您也可以考虑使用cartopy 代替底图。 basemap 或多或少已被 cartopy 完全取代。两者都是基于 matplotlib 的映射工具包,cartopy 要好得多,我。地图轴是 Axes 的真正子类,因此没有单独的 Basemap 对象,而是真正的轴。此外,根据我的经验,Cartopy 比底图具有更多功能,而且通常更快。

【讨论】:

  • 感谢乔的回复。当我运行它时,我收到一条错误消息,指出 Basemap 没有注释作为属性。
  • @DJV - 您需要使用ax.annotate,而不是m.annotate。 (我在初始版本中有错字。现在编辑。)
  • 啊,完美!谢谢。
  • 乔,cartopy 看起来很棒。我有一份免费的 Canopy 学生版,但似乎我必须为此付费。
  • 无论如何,您都可以单独安装。我不知道哪些版本的 Canopy 默认提供它,但它们都不应该阻止您安装它。 (顺便说一句,虽然 Canopy 相当不错,但您也可以看看 Anaconda,在更宽松的许可下进行类似的分发。)
猜你喜欢
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 2012-06-24
  • 2017-04-16
  • 1970-01-01
  • 2013-07-13
相关资源
最近更新 更多