- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试绘制全局气溶胶光学深度 (AOD),其值通常约为 0.2,但在某些地区可以达到 1.2 或更高。理想情况下,我想绘制这些高值,而不丢失较小值的细节。对数刻度颜色条也不太合适,因此我尝试使用 docs 中所述的两个线性范围。 :
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
import cartopy.crs as ccrs
class MidpointNormalize(colors.Normalize):
def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
self.midpoint = midpoint
colors.Normalize.__init__(self, vmin, vmax, clip)
def __call__(self, value, clip=None):
# I'm ignoring masked values and all kinds of edge cases to make a
# simple example...
x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
res = np.ma.masked_array(np.interp(value, x, y))
return res
当我尝试使用 Cartopy 绘制 pcolormesh 绘图时,此情况会中断。根据图库示例之一创建虚拟数据:
def sample_data(shape=(73, 145)):
"""Returns ``lons``, ``lats`` and ``data`` of some fake data."""
nlats, nlons = shape
lats = np.linspace(-np.pi / 2, np.pi / 2, nlats)
lons = np.linspace(0, 2 * np.pi, nlons)
lons, lats = np.meshgrid(lons, lats)
wave = 0.75 * (np.sin(2 * lats) ** 8) * np.cos(4 * lons)
mean = 0.5 * np.cos(2 * lats) * ((np.sin(2 * lats)) ** 2 + 2)
lats = np.rad2deg(lats)
lons = np.rad2deg(lons)
data = wave + mean
return lons, lats, data
ax = plt.axes(projection=ccrs.Mollweide())
lons, lats, data = sample_data()
ax.contourf(lons, lats, data,
transform=ccrs.PlateCarree(),
cmap='spectral', norm=MidpointNormalize(midpoint=0.8))
ax.coastlines()
ax.set_global()
plt.show()
但是,当使用 pcolormesh 等效项似乎不起作用时,它具有一组介于 0 到 180 度经度(图的右半部分)之间的模糊值,而不是等高线图中看到的波浪图案:
ax.pcolormesh(lons, lats, data,
transform=ccrs.PlateCarree(),
cmap='spectral', norm=MidpointNormalize(midpoint=0.8))
如何才能使 pcolormesh 工作?当我对 Cartopy 投影/转换做错事时,我通常会看到这种情况,所以大概这与 Cartopy 环绕日期线的方式或简单的 matplotlib 示例忽略的边缘情况之一有关,但我无法弄清楚出来吧。
请注意,这只在使用自定义规范化实例时才会发生;没有它,pcolormesh 也能按预期工作。
最佳答案
这似乎与规范化类内的屏蔽有关。所以这是一个有效的版本:
class MidpointNormalize(colors.Normalize):
def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
self.midpoint = midpoint
colors.Normalize.__init__(self, vmin, vmax, clip)
def __call__(self, value, clip=None):
result, is_scalar = self.process_value(value)
(vmin,), _ = self.process_value(self.vmin)
(vmax,), _ = self.process_value(self.vmax)
resdat = np.asarray(result.data)
result = np.ma.array(resdat, mask=result.mask, copy=False)
x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
res = np.interp(result, x, y)
result = np.ma.array(res, mask=result.mask, copy=False)
if is_scalar:
result = result[0]
return result
完整代码:
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
import cartopy.crs as ccrs
class MidpointNormalize(colors.Normalize):
def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
self.midpoint = midpoint
colors.Normalize.__init__(self, vmin, vmax, clip)
def __call__(self, value, clip=None):
result, is_scalar = self.process_value(value)
(vmin,), _ = self.process_value(self.vmin)
(vmax,), _ = self.process_value(self.vmax)
resdat = np.asarray(result.data)
result = np.ma.array(resdat, mask=result.mask, copy=False)
x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
res = np.interp(result, x, y)
result = np.ma.array(res, mask=result.mask, copy=False)
if is_scalar:
result = result[0]
return result
def sample_data(shape=(73, 145)):
"""Returns ``lons``, ``lats`` and ``data`` of some fake data."""
nlats, nlons = shape
lats = np.linspace(-np.pi / 2, np.pi / 2, nlats)
lons = np.linspace(0, 2 * np.pi, nlons)
lons, lats = np.meshgrid(lons, lats)
wave = 0.75 * (np.sin(2 * lats) ** 8) * np.cos(4 * lons)
mean = 0.5 * np.cos(2 * lats) * ((np.sin(2 * lats)) ** 2 + 2)
lats = np.rad2deg(lats)
lons = np.rad2deg(lons)
data = wave + mean
return lons, lats, data
ax = plt.axes(projection=ccrs.Mollweide())
lons, lats, data = sample_data()
norm = norm=MidpointNormalize(midpoint=0.8)
cm = ax.pcolormesh(lons, lats, data,
transform=ccrs.PlateCarree(),
cmap='spectral', norm=norm )
ax.coastlines()
plt.colorbar(cm, orientation="horizontal")
ax.set_global()
plt.show()
产生
关于python - 具有重新标准化颜色条的 Cartopy pcolormesh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43984077/
我画了两组重叠的轴,一组是另一组的放大版。我想在缩放轴的角和它在较大轴上代表的矩形的角之间画线。但是,我画的线稍微偏离了位置。我试图将其浓缩为一个简单的示例: import cartopy.crs a
我想知道给定纬度和经度,坐标是陆地还是海洋 根据https://gis.stackexchange.com/questions/235133/checking-if-a-geocoordinate-p
我已经看到了一些关于这个主题的其他问题,但是库已经发生了很大的变化,以至于这些问题的答案似乎不再适用。 栅格 used to include an example用于在 Cartopy GeoAxes
我正在为 xarray 进行一些开发。我试图安装 rasterio 但它似乎搞砸了我的 cartopy 安装。 我在我的 mac 上安装了 rasterio: brew install gdal pi
使用 basemap ,我曾经像这样添加我的自定义边界 shapefile: map = Basemap(..) map.readshapefile(file.shp, 'attribute', dr
所以,多年来我一直在 Python 2.7 中使用 Basemap,我正在转向 Python3.7 并且想转向 cartopy。我处理大量数据,其中我有投影信息,但我没有数据的纬度和经度网格。这就是我
我想要制作一个点的动画,该点沿着 map 上的一个位置到另一个位置的路径移动。 例如,我使用大地测量变换绘制了从纽约到新德里的路径。例如。取自文档 Adding data to the map plt
我想绘制来自全局多维数据集的数据,但仅限于国家/地区列表。因此,我根据国家/地区的“边界框”选择一个子立方体。 到目前为止一切顺利。我正在寻找一种简单的方法来掩盖立方体中不属于我的任何国家/地区的所有
如果我定义一组具有给定高度和宽度的(地理)轴,我如何确保绘图将填充这些轴? import matplotlib.pyplot as plt import cartopy.crs as ccrs ax
我有两个 shapefile。一个是点要素 shapefile,名为“point.shp”,另一个是名为“polygon.shp”的多边形 shapefile。我想使用 cartopy 添加到 map
我是 cartopy 的新手,仍在学习基本功能。 我试图绘制一个特定的区域,但是,当我请求 80oN 时,cartopy 扩展了这个区域并生成了一个高达大约 85oN 的 map 。有没有办法确保我只
我正在尝试在北太平洋投影上绘制 250 hPa 位势高度、1000 hPa 可降水量和 250 hPa 风速。当尝试使用倒刺时,我没有收到错误,但倒刺并没有实际显示在 map 上。我认为这可能与我的数
我想用 180 在图的底部绘制北半球的极地立体图,以便我可以强调太平洋地区。我正在使用来自 git 的最新 cartopy,并且可以制作极坐标立体图没有问题,但我无法弄清楚如何更改图底部的经度。我尝试
我正在使用 matplotlib 和 Cartopy 从二维网格数据集生成图像。以下链接中的示例如下所示: 驱动此图像创建并将出现问题的关键代码如下: dataset = Dataset('/path
我想使用 Cartopy 仅绘制一个区域(在我的例子中,北美和南美)。 我目前正在使用以下代码: import cartopy import cartopy.crs as ccrs import ma
我正在尝试使用 Cartopy 在北极立体 map 投影上创建等高线图。我使用 add_cycular_point() 尝试解决经度 0 和经度 35X 之间存在间隙的问题,并按照文档 (always
我正在尝试使用 Cartopy 和 Anaconda Python 绘制 map 点,但在转换时遇到了一些奇怪的失败。在我的简单示例中,我试图绘制 3 个点,但它们正在加倍。 import matpl
如何在 Cartopy 中绘制美国县边界? 绘制州和国家边界非常简单 ax.add_feature(cfeature.BORDERS.with_scale('50m')) ax.add_feature
我正在尝试在 OSM 图 block 之上过度绘制一些卫星图像数据。 我可以分别绘制它们,但似乎不能过度绘制,我认为这取决于投影。 我加载数据并获取投影信息 ds = gdal.Open(fname)
我正在尝试使用 cartopy 绘制北极的轮廓。我已经使用了 add_circlic_point ,这已经成功地填充了 pcolormesh 中本初子午线的间隙,但是轮廓没有成功交叉,而是绕地球一圈进
我是一名优秀的程序员,十分优秀!