我有两个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()失败,为什么?
谢谢
我正在用matplotlib做一些绘图,我有一个传说告诉观众哪些传感器记录了点.有多种类型的多个传感器,我希望在图例中有字幕,告诉观众每个组的传感器类型.我有一个有效的解决方案,但它有点像黑客,如下所示:
创建图例时,它接受两个重要参数:图例标记列表和图例标签列表.我目前的解决方案是将字幕标记设置为带有白色轮廓的白色框,并使字幕标记被两个换行符包围.它看起来不错,但如果字幕没有缩进,它看起来会更专业.我尝试过的两个解决方法是将字幕标记设置为None,并将字幕标记设置为所需的字幕字符串,将其标签设置为空字符串.两者都没有奏效.有人对这个有经验么?非常感谢.
我想在两点之间绘制一个很大的圆距离.我在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)
这使得以下图像:较短的线条
在这种情况下,红色大圆线看起来很糟糕,看起来是由于分辨率太低.如何增加构成大圆线的点数?
我使用了我的应用程序用户数量的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.任何帮助添加传奇将不胜感激. …
我对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()渲染的地图上的另一个示例:
有谁知道这个奇怪问题的起因是什么以及如何解决?
以下代码生成美国地图,其中每个州都有等高线。问题是该图像看起来像是使用 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) 有没有办法改进这个交互式 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)
我想用 180 在图的底部绘制北半球的极地立体图,以便我可以强调太平洋地区。我正在使用来自 git 的最新 cartopy,并且可以制作极坐标立体图没有问题,但我无法弄清楚如何更改图底部的经度。我尝试将经度范围设置为 [-180, 180] 但这没有帮助,而且 NorthPolarStereo() 不接受任何关键字参数,如 central_longitude。目前这可能吗?
我想用 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) 这个问题是关于绘制我使用兰伯特保形 (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) cartopy ×10
matplotlib ×8
python ×7
plot ×2
colorbar ×1
google-maps ×1
heatmap ×1
interactive ×1
legend ×1
projection ×1
transparency ×1