标签: matplotlib-basemap

Python底图立体图

我想在立体地图上显示一些值(在这种情况下是南极(spstere)).如果我在圆柱形地图(cyl)上显示它们一切都很好:

m = Basemap(projection='cyl',llcrnrlon=-180,llcrnrlat=-90,urcrnrlon=180,urcrnrlat=90,resolution='i') 
CS = m.scatter(lon2,lat2,c=BT2,edgecolors='none',s=sz,cmap='gray')
Run Code Online (Sandbox Code Playgroud)

现在我想在南极立体地图上使用相同的值,但我无法让它工作:

m = Basemap(projection='spstere',boundinglat=-10,lon_0=180,resolution='c')
CS = m.scatter(lon2,lat2,c=BT2,edgecolors='none',s=sz,cmap='gray')
Run Code Online (Sandbox Code Playgroud)

我做什么我只能画大陆,但没有数据.

python matplotlib matplotlib-basemap

7
推荐指数
1
解决办法
1792
查看次数

Pyplot等高线图 - clabel间距

我在使用matplotlib/pyplot/basemap时遇到了麻烦.我在地图上绘制轮廓线(气压).我使用clabel来显示轮廓线的值.但问题是:值和轮廓线之间的填充太多.我找到了参数"inline_spacing",我将其设置为零.但仍有很多自由空间.有任何想法吗?

自由空间轮廓标签

Python代码:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import pygrib

filename   = "file.grib2"
grbs       = pygrib.open('/data/' + filename)
grb        = grbs[2]
data       = grb.values
datac      = data*0.01
lats, lons = grb.latlons()

fig = plt.figure()
m = Basemap(projection='stere',lon_0=5,lat_0=90.0,\
            llcrnrlon=-25.0,urcrnrlon=60.0,llcrnrlat=30.0,urcrnrlat=60.0,resolution='l')

x, y = m(lons, lats)

levs = range(940,1065,5)
S1=plt.contour(x,y,datac,levs,linewidths=0.5,colors='b')
plt.clabel(S1,inline=1,inline_spacing=0,fontsize=8,fmt='%1.0f',colors='b')

m.drawmapboundary(fill_color='w')
m.drawcoastlines(linewidth=0.2)

plt.savefig('test.png', bbox_inches='tight',pad_inches=0.05, dpi=100)
Run Code Online (Sandbox Code Playgroud)

谢谢.

python matplotlib matplotlib-basemap

7
推荐指数
1
解决办法
6335
查看次数

导入的shapefile外部的掩码区域(底图/ matplotlib)

我正在通过Matplotlib在美国和加拿大东海岸的底图上绘制数据.除了基础层(填充的等高线图),我使用Matplotlib的readshapefile工具在数据顶部覆盖了这个焦点区域的shapefile.

我想知道如何掩盖shapefile之外的所有网格数据.我显然可以通过Matplotlib做一个maskocean命令,但我仍然留在圣劳伦斯以西的填充轮廓.现在有人怎么做?我在线搜索没有太多运气.

def make_map(lon,lat,param):
    fig, ax = plt.subplots()
    ax.axis('off')
    x1 = -83.
    x2 = -57.
    y1 = 37.
    y2 = 50.
    projection='merc'
    resolution='h'
    m = Basemap(projection=projection, llcrnrlat=y1, urcrnrlat=y2, llcrnrlon=x1,
                urcrnrlon=x2, resolution=resolution)
    x,y = m((lon-360.),lat)
    m.ax = ax
    my_cmap = cm.get_cmap('coolwarm')
    pp = m.contourf(x, y, param, 30, cmap=my_cmap, extend='both')  
    m.drawmapscale(-67, 39.5, -70, 43.5, 500, fontsize=8, barstyle='fancy') 
    return fig, m, x, y

def drawstates(ax, shapefile='../StateProv_UTMrp'):
        shp = m.readshapefile(shapefile, 'states',zorder = 1, drawbounds=True)
        for nshape, seg in enumerate(m.states):
            poly = Polygon(seg, facecolor='w',alpha=0.0, edgecolor='k') …
Run Code Online (Sandbox Code Playgroud)

python matplotlib esri shapefile matplotlib-basemap

7
推荐指数
1
解决办法
1680
查看次数

如何加速Python Basemap等值区动画

各种 来源获取想法,并结合我自己的想法,我试图创建一个动画地图,根据我的数据中的某些值显示国家的阴影.

基本过程是这样的:

  1. 运行数据库查询以获取数据集,按国家/地区和时间键入
  2. 使用pandas做一些数据操作(总和,平均等)
  3. 初始化底图对象,然后加载Load external shapefile
  4. 使用动画库为国家/地区着色,为数据集中的每个不同"时间"设置一帧.
  5. 保存为gif或mp4或其他

这很好用.问题是它非常慢.我有可能超过100k的时间间隔(超过几个指标)我想要制作动画,并且我得到每帧的平均时间为15秒,并且当帧数越多时,它就越糟糕.按照这个速度,我的计算机上的cpu和内存可能需要数周才能生成单个动画.

我知道matplotlib的速度并不快(例如:12)但是我读到了人们以5 + fps的速度生成动画并且想知道我做错了什么的故事.

我做过的一些优化:

  1. 仅重新着色动画功能中的国家/地区.这平均每帧约3秒,因此虽然可以改进,但它并不需要花费最多的时间.
  2. 我使用blit选项.
  3. 我尝试使用较小的绘图尺寸和不太详细的底图,但结果是微不足道的.

也许一个不太详细的shapefile会加快形状的着色,但正如我之前所说,每帧只有3s的改进.

这是代码(减去几个可识别的功能)

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time

from math import pi
from sqlalchemy import create_engine
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
from geonamescache import GeonamesCache
from datetime import datetime


def get_dataset(avg_interval, …
Run Code Online (Sandbox Code Playgroud)

python animation matplotlib matplotlib-basemap choropleth

7
推荐指数
0
解决办法
401
查看次数

Lat/lon使用Basemap和maskoceans在"for"循环后混淆

我试图在使用maskoceans时识别被遮罩像素的索引,这样我就可以只调用我目前正在全球范围内的代码中的陆地像素,即使我不关心海洋像素.我尝试了不同的方法,并注意到我的情节看起来很奇怪.最后,我意识到在我的纬度/经度指数中出现了混乱,尽管我实际上并没有碰到它们!这是代码:

import numpy as np
import netCDF4
from datetime import datetime, timedelta
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
import matplotlib.dates as mpldates
import heat_transfer_coeffs
from dew_interface import get_dew
from matplotlib.dates import date2num, num2date
import numpy as np
import netCDF4
import heat_transfer_coeffs as htc
from jug.task import TaskGenerator
import matplotlib.cm as cm
import mpl_toolkits
from mpl_toolkits import basemap
from mpl_toolkits.basemap import Basemap, maskoceans
np.seterr(all='raise')

# set global vars
ifile = netCDF4.Dataset('/Users/myfile.nc', 'r')
times = ifile.variables['time'][:].astype(np.float64)  # hours …
Run Code Online (Sandbox Code Playgroud)

python latitude-longitude netcdf python-2.7 matplotlib-basemap

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

如何在python中通过drawparallels将标签字体设置为"Time New Roman"

我画了一张标有纬度的地图,但我想将字体设置为"Times New Roman".如何使它成为可能?

m.drawparallels(相似之处,标签= [1,0,0,0],字体大小= 12)

python matplotlib-basemap

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

在底图中填充海洋

我试图在 a 上绘制 1x1 度数据matplotlib.Basemap,并且我想用白色填充海洋。但是,为了让海洋的边界遵循 绘制的海岸线matplotlib,白色海洋掩膜的分辨率应该比我的数据分辨率高很多。

搜索了很长时间后,我尝试了两种可能的解决方案:

(1)maskoceans()is_land()函数,但由于我的数据分辨率低于底图绘制的地图,因此边缘看起来不太好。我也不想将我的数据插入到更高分辨率。

(2) m.drawlsmask(),但由于无法分配 zorder ,因此 pcolormesh 图始终覆盖掩码。

这段代码

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.basemap as bm

#Make data
lon = np.arange(0,360,1)
lat = np.arange(-90,91,1)
data = np.random.rand(len(lat),len(lon))

#Draw map
plt.figure()
m = bm.Basemap(resolution='i',projection='laea', width=1500000, height=2900000, lat_ts=60, lat_0=72, lon_0=319)
m.drawcoastlines(linewidth=1, color='white')
data, lon = bm.addcyclic(data,lon)
x,y = m(*np.meshgrid(lon,lat))
plt.pcolormesh(x,y,data)
plt.savefig('1.png',dpi=300)
Run Code Online (Sandbox Code Playgroud)

生成此图像: 上面代码的结果

添加m.fillcontinents(color='white')产生以下图像,这是我需要的,但要填充海洋而不是陆地。 同上,但国家在最前面

编辑

m.drawmapboundary(fill_color='lightblue') 也会填满土地,因此无法使用。

理想的结果是海洋是白色的,而我所绘制的则plt.pcolormesh(x,y,data)显示在陆地上。

python mask matplotlib matplotlib-basemap

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

如何在 python 中使用纬度和经度数据绘制地图并突出显示地图中的几个纬度和经度点?

我是使用 python 的新手。

我有一个关于如何使用纬度和经度数据在 Python 中绘制地图的问题?

我之前做过什么:

第 1 步:我有一个 CSV 文件,其中包含有关车辆驾驶信号的信息。
步骤 2:从文件中,我以 pandas 数据帧的形式提取了一些纬度和经度数据。
第 3 步:现在我将该数据框保存为 CSV 文件。
第 4 步:保存后,我将该文件提供给 Online GPS Visualizer,以便它生成一个开放街道地图。

[![在此处输入图像描述][1]][1]

要求编号:1

我只想在 python 中绘制相同的地图,而不是向 Online GPS Visualizer 提供 Lat&Long csv 文件。那么我应该使用哪个库?底图库适合我的工作还是我应该选择其他选择?

要求编号:2

在 python 中绘制地图后,我只想突出显示地图中的一些纬度和经度点。(如图所示)

python python-3.x pandas matplotlib-basemap

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

使用非零 alpha 值时,底图中的 pcolormesh 上会出现奇怪的线条

当在底图投影(或 cartopy 投影)上使用 pcolormesh 绘制数据时,我注意到当我将 alpha 值设置为小于 1 时,会出现奇怪的线条。

示例代码:

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt

plt.clf()

dpp =1 # degrees per pixel
lons = np.arange(-180,180+dpp,dpp)
lats = -1*np.arange(-90,90+dpp,dpp)

m = Basemap(projection='robin',lon_0=0)
data = np.random.random((np.size(lats), np.size(lons)))
lons, lats = np.meshgrid(lons, lats)
x, y = m(lons, lats)

im = m.pcolormesh(x, y, x, latlon=False, cmap='RdBu')
#im = m.pcolormesh(lons, lats, data, latlon=True, cmap='RdBu')

m.colorbar(im)
plt.show()
Run Code Online (Sandbox Code Playgroud)

输出显示出现奇怪的行:

在此输入图像描述

如果我设置 alpha=1,线条就会消失并且行为符合预期:

在此输入图像描述

关于如何让 pcolormesh 使用非零 alpha 值有什么想法吗?

python matplotlib matplotlib-basemap cartopy

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

Python,IndexError:用作索引的数组必须是整数(或布尔)类型

我收到一个 IndexError:用作索引的数组必须是 pcolormesh 行的整数(或布尔)类型,知道如何处理这个问题。

脚本:

import numpy as np 
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

data = np.loadtxt('out (copie).txt')
lats = data[:,0]
lons = data[:,1]
codg_tec = data[:,2]

m = Basemap(projection = 'merc', llcrnrlon= -9, llcrnrlat=19, urcrnrlon= 12, urcrnrlat= 37,  resolution= 'i')
m.drawcoastlines()

lon, lat = np.meshgrid(lons, lats)
x, y = m(lon, lat)

cb = m.pcolormesh(x, y, np.squeeze(data[codg_tec]) , shading='flat', cmap=plt.cm.jet)
cbar = m.colorbar(cb, location = 'right', pad = '10%')

m.drawmapboundary()
m.drawmapscale()
m.drawmeridians(np.arange(-9,12,5), labels=[False,False,False,True])
m.drawparallels(np.arange(19,38,5), labels=[True,False,False,False])
m.drawstates()
m.drawcountries() …
Run Code Online (Sandbox Code Playgroud)

python matplotlib-basemap

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