>>> 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()
_images/sec5_draw_4_0.png

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()
_images/sec5_draw_6_0.png

在地图中绘制点中,通常使用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()
_images/sec5_draw_9_0.png

如果参数是数组,则输出是一行(在这种情况下不带标记):

>>> 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()
_images/sec5_draw_11_0.png

我们通过上图可以看到的城镇已被标记,但标签开始在点的顶部。而且它们不是正确的点,我们可以向这些点添加偏移量。让我们将所有标签向上和向右移动一点。 (如果你好奇,这些偏移在地图投影坐标中,以米为单位,这意味着我们的代码实际上将标签放置在东部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()
_images/sec5_draw_13_0.png

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()
>>>
_images/sec5_draw_15_0.png
  • 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()
_images/sec5_draw_18_0.png
  • 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()
_images/sec5_draw_20_0.png

请记住,调用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()
_images/sec5_draw_22_0.png
  • 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
_images/sec5_draw_25_1.png
  • x和y是地图投影中的坐标。不接受坐标数组,因此要添加多个标签,应多次调用该方法。

  • s是文本字符串。

  • 当设置为true时,withdrawash将创建一个带有短划线的text。

  • fontdict可用于对text属性进行分组。

  • text可以有许多选项,如:

    • fontsize字体大小。

    • fontweight的字体重量,如粗体。

    • ha horitzontal对齐,像中心,左或右。

    • va垂直对齐,如中心,顶部或底部。

    • 图像的颜色。

    • bbox在文本周围创建一个框:bbox = dict(facecolor =‘red’,alpha = 0.5)。