如何在等高线图上绘制具有条件的数组?

2024-03-29

我使用下面的代码绘制了 GPP 的全球地图:

( 'lon' 和 'lat' 都是 netCDF4 属性,形状分别为 (144, ) 和 (90, ) ,而 'gpp_avg' 是一个 numpy 数组,形状为 (90, 144) )

import numpy as np
import netCDF4 as n4
import matplotlib.pyplot as plt

import cartopy as cart
import cartopy.crs as ccrs
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from mpl_toolkits.basemap import Basemap

>> gpp_avg = n4.Dataset('decadal_gpp.nc', 'r')
>> lon = gpp_avg.variables['lon'] # 144 grid cells every 2.5 degrees (east-west)
>> lat = gpp_avg.variables['lat'] # 90 grid cells every 2 degrees (north-south)

>> # Plotting data on a map with Cartopy
>> plt.figure()
>> ax = plt.axes(projection=ccrs.PlateCarree())
>> ax.coastlines() # Adding coastlines
>> ax.add_feature(cart.feature.OCEAN, zorder=100, edgecolor='k')
>> cs = ax.contourf(lon[:], lat[:], gpp_avg[:], cmap = 'Spectral')

>> cbar = plt.colorbar(cs, ax=ax) # Additional necessary information
>> cbar.set_label('g[C]/m^2/day')
>> gridl = ax.gridlines(color="black", linestyle="dotted", 
           draw_labels=True) # Adding axis labels - latitude & longitude
>> gridl.xformatter=LONGITUDE_FORMATTER
>> gridl.yformatter=LATITUDE_FORMATTER
>> gridl.xlabels_top = False
>> gridl.ylabels_right = False
>> plt.show()

我有一个 numpy 数组“ci_95_gpp”,其形状为 (90, 144),其中包含全局地图的每个网格单元的 p 值。我想在全局等值线图顶部绘制 p 值大于 2 的点。

我该怎么做呢?非常感谢。


我为 Cartopy 地图上的等值线图生成了一组数据。轮廓数据点分为 2 组,分别具有负 z 值和正 z 值。麻木maskedarray用于该操作。我希望这对包括OP在内的普通读者有用。

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mticker
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import pandas as pd

from numpy.random import uniform, seed
from matplotlib.mlab import griddata   
# TODO, use newer scipy.interpolate() instead of `griddata`
import numpy.ma as ma

# make up some data around long,lat: (90, 18)
seed(0)
npts = 200
x0, y0 = 90, 18   # center of map in (long, lat), degrees
x = x0+uniform(-2, 2, npts)
y = y0+uniform(-2, 2, npts)
#z = x*np.exp(-x**2 - y**2)
z = (x-x0)*np.exp(-(x-x0)**2 - (y-y0)**2)  # elevation in meters

# define grid, for points interpolation from the made-up data above
gridx, gridy = 50,50
xi = x0+np.linspace(-2.1, 2.1, gridx)
yi = y0+np.linspace(-2.1, 2.1, gridy)

# interpolate for gridded data of (gridx, gridy) 
zi = griddata(x, y, z, xi, yi, interp='linear')
# xi.shape, yi.shape, zi.shape  => ((50,), (50,), (50, 50))

xig,yig = np.meshgrid(xi, yi)

# projection
useproj = ccrs.PlateCarree()
fig = plt.figure(figsize = (9, 7))
rect = [0.05, 0.05, 0.95, 0.95]  # for map extent
ax = fig.add_axes( rect, projection=useproj )

# contour the gridded data, plotting dots at the nonuniform data points.
CS = ax.contour(xig, yig, zi, 15, linewidths=0.5, colors='k')
CS = ax.contourf(xig, yig, zi, 15,
                  vmax=abs(zi).max(), vmin=-abs(zi).max())
plt.colorbar(CS)  # draw colorbar

# prep points for scatterplot of the gridded points
# make 2 masked-arrays, based on `zi`
mag = ma.masked_greater(zi, 0)  # mask points with +ve zi values
mal = ma.masked_less(zi, 0)     # mask points with -ve zi values

# apply masking to xig,yig; borrowing mask from mag
xig_greater_masked = ma.MaskedArray(xig, mask=mag.mask)  # must have compatible values
yig_greater_masked = ma.MaskedArray(yig, mask=mag.mask)

# apply masking to xig,yig; borrowing mask from mal
xig_less_masked = ma.MaskedArray(xig, mask=mal.mask)
yig_less_masked = ma.MaskedArray(yig, mask=mal.mask)

# for points with -ve z values (result of .masked_greater)
plt.scatter(xig_greater_masked, yig_greater_masked, s=3, color="w", \
            alpha=1, zorder=15, label="masked_greater z")
# for points with +ve z values (result of .masked_less)
ax.scatter(xig_less_masked, yig_less_masked, s=3, color="r", alpha=1, \
           zorder=15, label="masked_less z") 

leg = ax.legend(title='Masked z', framealpha=1.0, facecolor="lightgray")
leg.set_zorder(20)

gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
                  linewidth=2, color='gray', alpha=0.5, linestyle='--')

gl.xlabels_top = False
gl.ylabels_right = False

gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
gl.xlabel_style = {'size': 15, 'color': 'gray'}
#gl.xlabel_style = {'color': 'gray', 'weight': 'bold'}

plt.title('Masked data plot on contour')
plt.show()

结果图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在等高线图上绘制具有条件的数组? 的相关文章

  • 什么时候使用nonlocal关键字? [复制]

    这个问题在这里已经有答案了 我不明白为什么我可以在这里使用系列变量 def calculate mean series def mean new value series append new value total sum series
  • 如何在seaborn中记录比例

    我正在使用seaborn 绘制一些生物学数据 我想要一个基因相对于另一个基因的分布 在约 300 名患者中表达 并且以下代码工作正常 graph sns jointplot x Gene1 y Gene2 data data kind re
  • Python:在 Plotly 中的图形上方创建注释空间

    我想在图中创建额外的注释空间 请参阅附图中的绿色区域 目前 y 轴定义了绘图的高度 我可以将绘图推到超出 y max 限制 在某个点 在图像中标记为红色 之后隐藏 y 轴吗 我尝试避免轴到达 评论部分 绿色 谢谢你 在此输入图像描述 htt
  • 什么时候使用变量类? (布尔变量、双变量、整数变量、字符串变量)

    Can t tkinter widget configure text our text 用于所有小部件 有什么好处 或者说主要使用目的 var cls tkinter StringVar tkinter widget configure
  • 有没有办法将类实例定义为 None ?

    例如 当我有这样一个Node类定义 class Node def init self val None next None self val val self next next def bool self return self val
  • Python 的局限性是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我花了几天时间阅读有关 C 和 Python 的内容 发现 Python 非常简单且易于学习 所以我想知道它真的值得花时间学习吗 或者我应该花时
  • 仅使用 NumPy einsum 处理上三角元素

    我使用 numpy einsum 来计算形状为 3 N 的列向量 pts 数组与其自身的点积 从而得到形状为 N N 的矩阵 dotps 与所有点积 这是我使用的代码 dotps np einsum ij ik gt jk pts pts
  • 敌人不会在 pygame 中自行移动[重复]

    这个问题在这里已经有答案了 好吧 所以我的敌人只有在我移动角色时才会移动 但有时它也会完全从游戏窗口中产生 还有背景 玩家和敌人 在我按下移动按钮之前不会弹出 我对此感到非常抱歉 lmfao 也对我被告知将它们放在那里以提醒 wtf 的文本
  • python3导入找不到模块

    我正在尝试测试书中的一个例子 我得到了一个ImportError 该示例开始如下 from tkinter import from PP4E Gui Tools widgets import frame button entry 如果我放一
  • 如何安装我的自定义 Python 包及其自定义依赖项?

    我想找到一种方法来安装我自己的 python 包 该包依赖于其他自定义 python 包 我按照本指南创建了我自己的 python 包 https python packaging readthedocs iao en latest htt
  • Python在虚拟环境中找不到包

    我正在尝试为项目设置环境 但 python 无法找到我使用 pip 安装的模块 我做了以下事情 mkdir helloTwitter cd helloTwitter virtualenv myenv Installing setuptool
  • 如何根据 pandas 列注释散点图中的点

    Wanted Age 作为 x 轴 Pos 作为 y 轴 标签为 Player 名字 但由于某种原因 无法对点进行标记 Code import numpy as np import matplotlib pyplot as plt impo
  • 为什么 django-rest-frameworks request.data 有时是不可变的?

    在我宁静的CreateAPIView我变异我的request data字典 有时我会收到测试未捕获的错误 This QueryDict instance is immutable 例如这 class CreateView CreateAPI
  • PyQt5:如何将 QPushButton 连接到插槽?

    好吧 几乎所有教程 可理解的用人类语言编写的文档都是针对 PyQt4 的 但是 PyQt5 改变了整个 将按钮连接到插槽 的工作方式 但我仍然不知道如何做到这一点 我在 QtDesigner 中做了一个快速 gui 并且有一个 QPushB
  • 如何使用计划库运行异步函数?

    我正在使用discord py rewrite 编写一个discord 机器人 并且我想每天在特定时间运行一个函数 我对异步函数完全没有经验 而且我无法弄清楚如何在不使用 await 的情况下运行异步函数 这只是我的一段代码 这就是为什么有
  • 如何像 urllib 这样的模拟/存根 python 模块

    我需要测试一个需要使用 urllib urlopen 它也使用 urllib urlencode 查询外部服务器上的页面的函数 服务器可能宕机 页面可能发生变化 我不能依赖它进行测试 控制 urllib urlopen 返回内容的最佳方法是
  • 将时间戳合并到自定义时间段中

    我对熊猫相当陌生 并且遇到了障碍 我有一个包含时间戳的数据帧 我想在我的数据框中添加一列 其中包含自定义期间名称 字符串 例如 df pd DataFrame pd date range 01 01 00 00 periods 72 fre
  • SQLAlchemy - 如何从 ResultProxy 访问列名并写入 CSV 标题

    我正在尝试使用 SQLAlchemy 建立与 PostgreSQL 数据库的连接 执行 SQL 查询并将文件的输出打印到 Linux 中的文件中 from sqlalchemy import create engine import yam
  • 如何在 Jinja2 中包含具有相对路径的模板

    我正在尝试在模板中包含同一文件夹中的另一个模板 为此 我只是在做 import header jinja2 问题是我不断收到TemplateNotFound error 我的模板文件夹看起来像 myProject templates arb
  • set()是如何实现的?

    我见过有人这么说setpython 中的对象具有 O 1 成员资格检查 他们如何在内部实施以实现这一点 它使用什么类型的数据结构 该实施还有哪些其他影响 这里的每个答案都非常有启发性 但我只能接受一个 所以我将选择最接近我原来问题的答案 谢

随机推荐