>>> from env_helper import info; info()
页面更新时间: 2022-05-27 12:19:20
运行环境:
Linux发行版本: Debian GNU/Linux bookworm/sid
操作系统内核: Linux-5.16.18-200.fc35.x86_64-x86_64-with-glibc2.33
Python版本: 3.10.4
17.4. 使用plot绘图¶
在地图上绘制标记或线条。
plot(x, y, *args, **kwargs)
第一个示例显示单个点:
>>> %matplotlib inline
>>> import warnings
>>> warnings.filterwarnings('ignore')
>>> import os
>>> from mpl_toolkits.basemap import Basemap
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> my_map = Basemap(projection='merc', lat_0=57, lon_0=-135,
>>> resolution='h', area_thresh=0.1,
>>> llcrnrlon=-136.25, llcrnrlat=56.0,
>>> urcrnrlon=-134.25, urcrnrlat=57.75)
>>> my_map.drawcoastlines()
>>> my_map.drawcountries()
>>> my_map.fillcontinents(color='coral')
>>> my_map.drawmapboundary()
>>> lon = -135.3318
>>> lat = 57.0799
>>> x, y = my_map(lon, lat)
>>> my_map.plot(x, y, 'bo', markersize=12)
>>>
>>> plt.show()
x和y可以是带有投影单元中标记位置的浮点,也可以是带有绘制线的点的列表。
如果lat与lon关键字设置为True,则x,y将解释为经度和纬度,以度为单位。不会在旧的Basemap版本中工作。
默认情况下,标记是一个点。此页面解释所有选项。
默认情况下,颜色为black(k)。
现在让我们给地图添加一些点。例如在Sitan,Baranof岛上最大的社区,我们添加一个点,显示Sitka的位置。在plt.show()之前添加以下行:
>>> my_map = Basemap(projection='merc', lat_0=57, lon_0=-135,
>>> resolution='h', area_thresh=0.1,
>>> llcrnrlon=-136.25, llcrnrlat=56.0,
>>> urcrnrlon=-134.25, urcrnrlat=57.75)
>>>
>>> my_map.drawcoastlines()
>>> my_map.drawcountries()
>>> my_map.fillcontinents(color='coral')
>>> my_map.drawmapboundary()
>>>
>>> lons = [-135.3318, -134.8331, -134.6572]
>>> lats = [57.0799, 57.0894, 56.2399]
>>> x, y = my_map(lons, lats)
>>> my_map.plot(x, y, 'bo', markersize=10)
>>>
>>> plt.show()
在地图中绘制点中,通常使用plot方法:
当您具有点的经度和纬度时,使用Basemap实例计算地图坐标中点的位置
如果lat和lon的关键字设置为True,则x,y将解释为经度和纬度,以度为单位。不会在旧Basemap的版本中工作.
绘图需要地图坐标中的x和y位置,在标记和颜色都默认情况下,标记是一个点。 此页面解释所有选项。默认情况下,颜色为black(k)。
这里唯一不明显的是bo参数,它告诉底图对点使用蓝色圆圈。有相当多的颜色和符号,你可以使用。默认标记大小为6,但在此特定地图上太小。12的markersize显示在这张地图上。
绘制单个点的方法是很好的,但我们经常想在地图上绘制一个大的点集。以Baranof岛上的两个其他社区为例,展示这两个社区在这个地图上的位置。我们将点的纬度和经度存储在两个单独的列表中,将它们映射到x和y坐标,并在地图上绘制这些点。因为会在地图上还有更多的点,我们还想应该要稍微减小标记大小:
17.4.1. 标签点¶
现在让我们标记这三点。首先创建一个标签列表,并循环该列表。我们需要在此循环中为包括x和y值的每个点,因此Basemap可以确定放置每个标签的位置。
>>>
>>> my_map = Basemap(projection='merc', lat_0=57, lon_0=-135,
>>> resolution='h', area_thresh=0.1,
>>> llcrnrlon=-136.25, llcrnrlat=56.0,
>>> urcrnrlon=-134.25, urcrnrlat=57.75)
>>>
>>> my_map.drawcoastlines()
>>> my_map.drawcountries()
>>> my_map.fillcontinents(color='coral')
>>> my_map.drawmapboundary()
>>>
>>> lons = [-135.3318, -134.8331, -134.6572]
>>> lats = [57.0799, 57.0894, 56.2399]
>>> x, y = my_map(lons, lats)
>>> my_map.plot(x, y, 'bo', markersize=10)
>>> # 标记了三个点。
>>>
>>> labels = ['Sitka', 'Baranof Warm Springs', 'Port Alexander']
>>> # 每个点分别赋值。
>>>
>>> for label, xpt, ypt in zip(labels, x, y):
>>> plt.text(xpt, ypt, label)
>>> plt.show()
如果参数是数组,则输出是一行(在这种情况下不带标记):
>>> import numpy as np
>>>
>>> my_map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135,
>>> resolution = 'h', area_thresh = 0.1,
>>> llcrnrlon=-136.25, llcrnrlat=56.0,
>>> urcrnrlon=-134.25, urcrnrlat=57.75)
>>>
>>> my_map.drawcoastlines()
>>> my_map.drawcountries()
>>> my_map.fillcontinents(color = 'coral')
>>> my_map.drawmapboundary()
>>>
>>> lons = [-135.3318, -134.8331, -134.6572]
>>> lats = [57.0799, 57.0894, 56.2399]
>>> x,y = my_map(lons, lats)
>>> my_map.plot(x, y, 'bo', markersize=10)
>>>
>>> labels = ['Sitka', 'Baranof Warm Springs', 'Port Alexander']
>>> for label, xpt, ypt in zip(labels, x, y):
>>> plt.text(xpt+10000, ypt+5000, label)
>>>
>>> plt.show()
我们通过上图可以看到的城镇已被标记,但标签开始在点的顶部。而且它们不是正确的点,我们可以向这些点添加偏移量。让我们将所有标签向上和向右移动一点。 (如果你好奇,这些偏移在地图投影坐标中,以米为单位,这意味着我们的代码实际上将标签放置在东部10公里,实际城镇北部5公里。)
>>> map = Basemap(projection='ortho',lat_0=0, lon_0=0)
>>>
>>> map.drawmapboundary(fill_color='aqua')
>>> map.fillcontinents(color='coral',lake_color='aqua')
>>> map.drawcoastlines()
>>>
>>> lons = [-10, -20, -25, -10, 0, 10]
>>> lats = [40, 30, 10, 0, 0, -5]
>>>
>>> x, y = map(lons, lats)
>>>
>>> map.plot(x, y, marker=None,color='m')
>>> # 顺序连接每个点 颜色为m
>>> plt.show()
17.4.2. quiver¶
quiver(x, y, u, v, *args, **kwargs)
>>> my_map = Basemap(projection='merc', lat_0=57, lon_0=-135,
>>> resolution='h', area_thresh=0.1,
>>> llcrnrlon=-136.25, llcrnrlat=56.0,
>>> urcrnrlon=-134.25, urcrnrlat=57.75)
>>>
>>> my_map.drawcoastlines()
>>> my_map.drawcountries()
>>> my_map.fillcontinents(color='coral')
>>> my_map.drawmapboundary()
>>>
>>> lons = [-135.3318, -134.8331, -134.6572]
>>> lats = [57.0799, 57.0894, 56.2399]
>>> x, y = my_map(lons, lats)
>>> my_map.plot(x, y, 'bo', markersize=10)
>>>
>>> labels = ['Sitka', 'Baranof\n Warm Springs', 'Port Alexander']
>>> x_offsets = [10000, -20000, -25000]
>>> y_offsets = [5000, -50000, -35000]
>>>
>>> for label, xpt, ypt, x_offset, y_offset in zip(labels, x, y, x_offsets, y_offsets):
>>> plt.text(xpt + x_offset, ypt + y_offset, label)
>>>
>>>
>>> plt.show()
>>>
x和y给出了网格数据的位置,如果lat和lon自变量为真,则这些值应该在地理坐标中。如果没有,这些值应该在地图坐标中。
u和v是表示左右和上下幅度。
注意,它们不在南北或东西。如果输入投影具有非圆柱形投影(除cyl,merc,cyl,gall 和mill之外的投影),则应使用rotate_vector或transform_scalar方法旋转u和v。
第五个参数(可选)设置一个值将颜色分配给箭头。
scale使箭头更长或更短。
低于1的值的箭头增长。
枢轴改变箭头的旋转点。默认情况下是“tip”,但可以更改为“middle”。
这是更好的,但在这个尺度的地图上,相同的偏移量并不适用于所有点。我们可以单独绘制每个标签,但是最好是做出两个列表来存储偏移: 有没有容易的方法来保持“Baranof温泉”越过边界,但在标签中使用换行符使它更清晰一些。现在我们知道如何添加点到地图,我们可以移动到更大的数据集。
17.4.3. 多点Scatter¶
如果图像中有多个点,您可能更喜欢分散方法。首先创建一条连接它们的线将点数组传递到plot方法:
在地图上绘制多个标记。
scatter(x, y, *args, **kwargs)
>>> my_map = Basemap(projection='merc', lat_0=57, lon_0=-135,
>>> resolution='h', area_thresh=0.1,
>>> llcrnrlon=-136.25, llcrnrlat=56.0,
>>> urcrnrlon=-134.25, urcrnrlat=57.75)
>>>
>>> my_map.drawcoastlines()
>>> my_map.drawcountries()
>>> my_map.fillcontinents(color='coral')
>>> my_map.drawmapboundary()
>>>
>>> lons = [-135.3318, -134.8331, -134.6572]
>>> lats = [57.0799, 57.0894, 56.2399]
>>> x, y = my_map(lons, lats)
>>> my_map.plot(x, y, 'bo', markersize=10)
>>>
>>> # labels = ['Sitka', 'Baranof\n Warm Springs', 'Port Alexander']
>>> x_offsets = [10000, -20000, -25000]
>>> y_offsets = [5000, -50000, -35000]
>>>
>>> for label, xpt, ypt, x_offset, y_offset in zip(labels, x, y, x_offsets, y_offsets):
>>> plt.text(xpt + x_offset, ypt + y_offset, label)
>>>
>>> plt.show()
x和y是要作为标记添加到地图的点列表。
如果latlon关键字设置为True,则x,y将解释为经度和纬度,以度为单位。不会在旧Basemap版本中工作。
默认情况下,标记是一个点。
默认情况下,颜色为黑色(k)。
>>> map = Basemap(projection='ortho', lat_0=0, lon_0=0)
>>> map.drawmapboundary(fill_color='aqua')
>>> map.fillcontinents(color='coral',lake_color='aqua')
>>> map.drawcoastlines()
>>> lons = [0, 10, -20, -20]
>>> lats = [0, -10, 40, -20]
>>> x, y = map(lons, lats)
>>> map.scatter(x, y, marker='D',color='m')
>>> plt.show()
请记住,调用Basemap实例可以使用列表来完成,所以坐标变换也会立即完成。
散点法中的格式选项与绘图中的相同。
17.4.4. Streamplot¶
从矢量字段绘制流线图。
streamplot(x, y, u, v, *args, **kwargs)
>>>
>>> my_map = Basemap(projection='merc', lat_0=57, lon_0=-135,
>>> resolution='h', area_thresh=0.1,
>>> llcrnrlon=-136.25, llcrnrlat=56.0,
>>> urcrnrlon=-134.25, urcrnrlat=57.75)
>>>
>>> my_map.drawcoastlines()
>>> my_map.drawcountries()
>>> my_map.fillcontinents(color='coral')
>>> my_map.drawmapboundary()
>>>
>>> lons = [-135.3318, -134.8331, -134.6572]
>>> lats = [57.0799, 57.0894, 56.2399]
>>> x, y = my_map(lons, lats)
>>> my_map.plot(x, y, 'bo', markersize=10)
>>>
>>> labels = ['Sitka', 'Baranof\n Warm Springs', 'Port Alexander']
>>> x_offsets = [10000, -20000, -25000]
>>> y_offsets = [5000, -50000, -35000]
>>>
>>> for label, xpt, ypt, x_offset, y_offset in zip(labels, x, y, x_offsets, y_offsets):
>>> plt.text(xpt + x_offset, ypt + y_offset, label)
>>>
>>>
>>> plt.show()
x和y是与u和v数据大小相同的矩阵,包含地图坐标中元素的位置。
正如文档解释,x和y必须均匀分布。这意味着当原始值来自不同的投影时,必须重新投影 数据矩阵,并重新计算x和y矩阵,如在示例中所见。
要均匀计算间隔的网格,可以使用方法makegrid。最好使用returnxy = True属性来获取地图投影单元中的网格。
u和v是左右和上下幅度
注意,它们不在南北和东西。如果输入的投影具有非圆柱形投影(除cyl,merc,cyl,gall 和mill之外的投影),则应使用rotate_vector或transform_scalar方法旋转u和v
尺寸必须与x和y相同
颜色可以为流线设置相同的颜色,或根据数据进行更改:
如果值是标量,则所有流线将具有指示的颜色,这取决于色彩映射。
如果值是与数据(在示例中的风的模块)相同大小的数组,则颜色将根据它而改变,使用颜色图。
cmap设置颜色图
lineewidth以类似于颜色的方式设置流线的宽度
如果是标量,则所有流线具有指示的宽度。
如果是一个数组,流线宽度将根据数组的值而改变。
可以通过密度设置流线图的接近程度。 1值意味着域被划分为30×30,每个扇区只有一条流线。如果传递具有两个元素的列表,则将x和y密度设置为不同的值
norm标准化标尺以设置亮度数据。
arrowize缩放箭头大小。
arrowstyle stes箭头样式。文档在FancyArrowPatch minlength中。
设置地图坐标中流线的最小长度。
17.4.5. text¶
在地图上绘制text。
text(x, y, s, fontdict=None, withdash=False, **kwargs)
text方法不属于Basemap,但直接属于matplotlib,因此必须从图或轴实例中调用。
>>> map = Basemap(projection='ortho', lat_0=0, lon_0=105)
>>>
>>> map.drawmapboundary(fill_color='aqua')
>>> map.fillcontinents(color='#cc9955',lake_color='aqua')
>>> map.drawcoastlines()
>>>
>>> lon = 3.4
>>> lat = 3.4
>>>
>>> x, y = map(lon, lat)
>>>
>>> plt.text(x, y, 'Lagos',fontsize=12,fontweight='bold',
>>> ha='left',va='bottom',color='k')
>>>
>>> lon = 2.1
>>> lat = 41.
>>>
>>> x, y = map(lon, lat)
>>>
>>> plt.text(x, y, 'Barcelona',fontsize=12,fontweight='bold',
>>> ha='left',va='center',color='k',
>>> bbox=dict(facecolor='b', alpha=0.2))
>>>
>>>
>>> plt.show()
posx and posy should be finite values
posx and posy should be finite values
posx and posy should be finite values
posx and posy should be finite values
x和y是地图投影中的坐标。不接受坐标数组,因此要添加多个标签,应多次调用该方法。
s是文本字符串。
当设置为true时,withdrawash将创建一个带有短划线的text。
fontdict可用于对text属性进行分组。
text可以有许多选项,如:
fontsize字体大小。
fontweight的字体重量,如粗体。
ha horitzontal对齐,像中心,左或右。
va垂直对齐,如中心,顶部或底部。
图像的颜色。
bbox在文本周围创建一个框:bbox = dict(facecolor =‘red’,alpha = 0.5)。