标签: cartopy

如何使用cartopy添加点要素shapefile以进行地图绘制

我有两个shapefile.一个是点特征shapefile,名为"point.shp",另一个是名为"polygon.shp"的多边形shapefile.我想用cartopy添加到地图.我设法添加"polygon.shp",但失败了"point.shp".

这是我的代码:

import matplotlib.pyplot as plt
from cartopy import crs
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature

ax = plt.axes(projection=crs.PlateCarree())

# add the polygon file, worked
ax.add_geometries(Reader("polygon.shp").geometries(), crs.PlateCarree(), facecolor='w')

# or(also worked):
ax.add_feature(ShapelyFeature(Reader("polygon.shp").geometries(), crs.PlateCarree(), facecolor='r'))

# but these two ways both failed with the "point.shp"
ax.add_geometries(Reader("point.shp").geometries(), crs.PlateCarree())

# or, this doesn't work neither:
ax.add_feature(ShapelyFeature(Reader("polygon.shp").geometries(), crs.PlateCarree(), facecolor='r'))
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何做到这一点,或为什么,没有检索所有点'x,y coords然后绘制它们?

并且坐标(x,y值),ax.plot()工作,但ax.scatter()失败,为什么?

谢谢

cartopy

6
推荐指数
1
解决办法
2614
查看次数

Matplotlib传奇中的字幕

我正在用matplotlib做一些绘图,我有一个传说告诉观众哪些传感器记录了点.有多种类型的多个传感器,我希望在图例中有字幕,告诉观众每个组的传感器类型.我有一个有效的解决方案,但它有点像黑客,如下所示:

在此输入图像描述

创建图例时,它接受两个重要参数:图例标记列表和图例标签列表.我目前的解决方案是将字幕标记设置为带有白色轮廓的白色框,并使字幕标记被两个换行符包围.它看起来不错,但如果字幕没有缩进,它看起来会更专业.我尝试过的两个解决方法是将字幕标记设置为None,并将字幕标记设置为所需的字幕字符串,将其标签设置为空字符串.两者都没有奏效.有人对这个有经验么?非常感谢.

python plot matplotlib legend cartopy

6
推荐指数
1
解决办法
1253
查看次数

cartopy:大圆距离线的分辨率更高

我想在两点之间绘制一个很大的圆距离.我在cartopy docs中找到了一个(introductionctory_examples/01.great_circle.html):

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

ax = plt.axes(projection=ccrs.Robinson())

ax.set_global()

ax.coastlines()

plt.plot([-0.08, 132], [51.53, 43.17], color='red',      transform=ccrs.Geodetic())
plt.plot([-0.08, 132], [51.53, 43.17], color='blue', transform=ccrs.PlateCarree())

plt.show()
Run Code Online (Sandbox Code Playgroud)

这使得以下图像:

大圈子的例子

问题是,在我自己的工作中,这两点更接近,并且在不同的预测中(尽管我认为这在这里并不重要).如果我将此代码更改为较小区域中的一行,如下所示:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

ax = plt.axes(projection=ccrs.Robinson())

ax.set_extent([-5, 55, 40, 55])

ax.coastlines()

plt.plot([-0.08, 50], [51.53, 43.17], color='red',      transform=ccrs.Geodetic())
plt.plot([-0.08, 50], [51.53, 43.17], color='blue', transform=ccrs.PlateCarree())

plt.show()
Run Code Online (Sandbox Code Playgroud)

这使得以下图像:较短的线条

在这种情况下,红色大圆线看起来很糟糕,看起来是由于分辨率太低.如何增加构成大圆线的点数?

python matplotlib cartopy

6
推荐指数
1
解决办法
731
查看次数

在Matplotlib/Cartopy中创建颜色条图例

我使用了我的应用程序用户数量的cartopy和matplotlib制作了地理热图,但是在添加颜色条图例时遇到了问题:

import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

cmap = mpl.cm.Blues
# Countries is a dictionary of {"country_name": number of users}, for example
countries = {"United States": 100, "Canada": 50, "China": 10}

max_users = float(max(countries.values()))
shapename = 'admin_0_countries'
countries_shp = shpreader.natural_earth(resolution='110m', category='cultural', name=shapename)
ax = plt.axes(projection=ccrs.Robinson())
for country in shpreader.Reader(countries_shp).records():
    name = country.attributes['name_long']
    num_users = countries[name]
    ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                facecolor=cmap(num_users/max_users, 1))

plt.savefig('iOS_heatmap.png', transparent=True, dpi=900)
Run Code Online (Sandbox Code Playgroud)

哪个产生 在此输入图像描述

我想添加一个颜色条图例.有一个文件要做一个简单的matplotlib图,但我不知道如何通过cartopy,轴是a GeoAxesSubplot.任何帮助添加传奇将不胜感激. …

python matplotlib heatmap colorbar cartopy

6
推荐指数
1
解决办法
2313
查看次数

为什么我的Google瓷砖在Cartopy地图上看起来很差?

我对Cartopy渲染Google瓷砖感到有些困惑。与标准的Google地图外观相比,该地图看起来非常差。

示例(来自https://ocefpaf.github.io/python4oceanographers/blog/2015/06/22/osm/的代码):

import matplotlib.pyplot as plt

import cartopy.crs as ccrs
from cartopy.io import shapereader
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER

def make_map(projection=ccrs.PlateCarree()):
    fig, ax = plt.subplots(figsize=(9, 13),
                           subplot_kw=dict(projection=projection))
    gl = ax.gridlines(draw_labels=True)
    gl.xlabels_top = gl.ylabels_right = False
    gl.xformatter = LONGITUDE_FORMATTER
    gl.yformatter = LATITUDE_FORMATTER
    return fig, ax
import cartopy.io.img_tiles as cimgt

extent = [-39, -38.25, -13.25, -12.5]

request = cimgt.GoogleTiles()

fig, ax = make_map(projection=request.crs)
ax.set_extent(extent)

ax.add_image(request, 10)
Run Code Online (Sandbox Code Playgroud)

产生:

分辨率差

与链接的网站上显示的同一张图片相比,这看起来非常糟糕-查看文字标签和街道编号的像素化渲染:

在此处输入图片说明

更改缩放级别似乎并不能改善这种情况。

这是由Cartopy和googletiles()渲染的地图上的另一个示例:

很穷

Google地图中显示的同一张地图

谷歌地图

有谁知道这个奇怪问题的起因是什么以及如何解决?

python google-maps matplotlib cartopy

6
推荐指数
1
解决办法
1693
查看次数

提高Cartopy地图的分辨率

以下代码生成美国地图,其中每个州都有等高线。问题是该图像看起来像是使用 20 世纪 90 年代的技术生成的。如何显着提高图形的质量,即提高背景的分辨率?

import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader

import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 400

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())
ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())
ax.stock_img()


shapename = 'admin_1_states_provinces_lakes_shp'
states_shp = shpreader.natural_earth(resolution='110m', category='cultural',
                                     name=shapename)

ax.outline_patch.set_visible(False)  # don't draw the map border
ax.set_title('My map of the lower 48')

# example state coloring
colors = {
    'Minnesota': [0, 1, 0],
    'Texas': "#FF0000",
    'Montana': "blue",
}
default_color = [0.9375, …
Run Code Online (Sandbox Code Playgroud)

python matplotlib cartopy

6
推荐指数
1
解决办法
7694
查看次数

如何以交互方式更改 cartopy 投影的中心?

有没有办法改进这个交互式 matplotlib/cartopy 脚本的渲染?

请先安装 ipympl https://github.com/matplotlib/ipympl

我还没有找到如何在不实例化新图形的情况下更改中心经度和纬度。

当单击鼠标左键并选择新的投影中心时,此脚本缺乏流动性。我正在寻找https://twojs.org/examples/misc_controls_trackball中的轨迹球行为。

欢迎任何帮助/建议。

%matplotlib widget

import numpy as np
import matplotlib.pyplot as plt
import cartopy
import cartopy.crs as ccrs

fig = plt.figure(figsize=(10,6), layout='constrained')

proj0 = ccrs.PlateCarree()
proj1 = ccrs.Orthographic(0, 80)

ax1 = fig.add_subplot(1, 1, 1, projection=proj1)
ax1.coastlines()
ax1.gridlines(xlocs=np.arange(-180,180,10), ylocs=np.arange(-80,90,10))
ax1.set_global()

def onpress(event):
    global proj1
    if event.button == 1:
        lon, lat = proj0.transform_point(event.xdata, event.ydata, src_crs=proj1)
        proj1 = ccrs.Orthographic(lon, lat)
        ax1 = fig.add_subplot(1, 1, 1, projection=proj1)
        ax1.coastlines()
        ax1.gridlines(xlocs=np.arange(-180,180,10), ylocs=np.arange(-80,90,10))
        ax1.set_global()
        plt.draw()

fig.canvas.mpl_connect('button_press_event', onpress)

plt.show()

Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

interactive projection matplotlib cartopy

6
推荐指数
0
解决办法
406
查看次数

NorthPolarStereo 的中心经度

我想用 180 在图的底部绘制北半球的极地立体图,以便我可以强调太平洋地区。我正在使用来自 git 的最新 cartopy,并且可以制作极坐标立体图没有问题,但我无法弄清楚如何更改图底部的经度。我尝试将经度范围设置为 [-180, 180] 但这没有帮助,而且 NorthPolarStereo() 不接受任何关键字参数,如 central_longitude。目前这可能吗?

cartopy

5
推荐指数
1
解决办法
1433
查看次数

用 cartopy 制作透明图

我想用 Cartopy 创建一个透明地图(然后可以用作 Web 应用程序的叠加层)。

曾尝试使用多种设置、投影、绘图类型等,但从未设法获得透明的 Cartopy 地图。

这是一个简单的例子,说明透明度如何在 Cartopy 中不起作用,以及它如何在不使用 Cartopy 的情况下工作。

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np

#some data:
shape=(20, 30)
scale = 30
x = np.linspace(-scale, scale, shape[1])
y = np.linspace(-scale, scale, shape[0])

x2d, y2d = np.meshgrid(x, y)
u = 10 * np.cos(2 * x2d / scale + 3 * y2d / scale)
v = 20 * np.cos(6 * x2d / scale)

#cartopy
ef, ax = plt.subplots(1,1,figsize=(10,8), subplot_kw={'projection': ccrs.GOOGLE_MERCATOR})    
ef.subplots_adjust(hspace=0.0,wspace=0,bottom=0,top=1,left=0,right=1)

ax.quiver(x2d,y2d, …
Run Code Online (Sandbox Code Playgroud)

python transparency matplotlib cartopy

5
推荐指数
1
解决办法
1725
查看次数

使用 cartopy 在其他投影仪中绘制投影数据

这个问题是关于绘制我使用兰伯特保形 (LCC) CRS 的一些数据。虽然这些问题特别与在多个投影中绘制 LCC 数据有关,但它也适用于 cartopy 的一般使用,因为我想更好地理解使用 cartopy 绘制的逻辑/过程。

下面是我正在尝试做的一些代码示例。第一个示例只是绘制一些 LCC 数据。我使用的数据可在此处的链接中获得。

import cartopy.crs as ccrs
import cartopy.feature as cf
import matplotlib.pyplot as plt
import numpy as np

proj = ccrs.LambertConformal(central_latitude = 25, 
                             central_longitude = 265, 
                             standard_parallels = (25, 25))

# Data and coordinates (from download link above)
with np.load('nam_218_20120414_1200_006.npz') as nam:
   dat = nam['dpc']
   lat = nam['lat']
   lon = nam['lon']

ax = plt.axes(projection = proj)
ax.pcolormesh(lon, lat, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
               category='cultural',
               name='admin_1_states_provinces_lines',
               scale='50m',
               facecolor='none')) …
Run Code Online (Sandbox Code Playgroud)

python plot matplotlib cartopy

5
推荐指数
2
解决办法
6650
查看次数