我正在使用以下代码在地图上绘制数据:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
from scipy.io import netcdf
ncfile = netcdf.netcdf_file(myfile.nc,'r')
lon = ncfile.variables['longitude'][:]
lat = ncfile.variables['latitude'][:]
data = ncfile.variables['mydata'][:]
ncfile.close()
m = Basemap(projection='nplaea', boundinglat=40, lon_0=270)
m.drawcoastlines(linewidth=.6, zorder=2)
m.drawparallels(np.arange(-80.,81.,20.), zorder=1)
m.drawmeridians(np.arange(-180.,181.,20.), zorder=1)
cNorm = mpl.colors.Normalize(vmin=0, vmax=np.nanmax(data))
cmap = plt.get_cmap('jet')
lons, lats = np.meshgrid(lon, lat)
x, y = m(lons, lats)
datamap = m.pcolor(x, y, data, zorder=0)
datamap.set_norm(cNorm)
plt.colorbar(datamap, cmap=cmap, norm=cNorm, …Run Code Online (Sandbox Code Playgroud) 我无法让我的Mac中的底图在Python中运行.
我一直收到:
from mpl_toolkits.basemap import basemap
ImportError: No module named basemap
Run Code Online (Sandbox Code Playgroud)
我做了什么:
brew install gdal
brew install gets
export GEOS_DIR=/usr/local/Cellar/geos/3.4.2/
basemap-1.0.7 $ python setup.py install
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
basemap-1.0.7 $ cd geos-3.3.3
basemap-1.0.7/geos-3.3.3 $ export GEOS_DIR=~/
basemap-1.0.7/geos-3.3.3 $ ./configure --prefix=$GEOS_DIR
basemap-1.0.7/geos-3.3.3 $ make
basemap-1.0.7/geos-3.3.3 $ make install
basemap-1.0.7/geos-3.3.3 $ cd ..
basemap-1.0.7 $ python setup.py install
Run Code Online (Sandbox Code Playgroud)
他们都没有为我工作.如何让这个软件包在MacOS Sierra上运行?
我正在寻找一种在Basemap上绘制填充矩形的方法.我可以使用该drawgreatcircle方法轻松绘制矩形的边缘,但我找不到实际填充这些矩形的方法(指定颜色和alpha).
我想在地图上绘制一个图形,其中节点将由坐标(纬度,长度)定义并且具有一些值相关联.
我已经能够将点绘制为底图上的散点图,但似乎无法找到如何在地图上绘制图形.
谢谢.
编辑:我添加了关于如何在底图上绘制点的代码.它的大部分是改编自代码在这个文章.
from mpl_toolkits.basemap import Basemap
from shapely.geometry import Point, MultiPoint
import pandas as pd
import matplotlib.pyplot as plt
m = Basemap(
projection='merc',
ellps = 'WGS84',
llcrnrlon=-130,
llcrnrlat=25,
urcrnrlon=-60,
urcrnrlat=50,
lat_ts=0,
resolution='i',
suppress_ticks=True)
# Create Point objects in map coordinates from dataframe lon
# and lat values
# I have a dataframe of coordinates
map_points = pd.Series(
[Point(m(mapped_x, mapped_y))
for mapped_x, mapped_y in zip(df['lon'],
df['lat'])])
amre_points = MultiPoint(list(map_points.values))
plt.clf()
fig = plt.figure()
ax = fig.add_subplot(111, …Run Code Online (Sandbox Code Playgroud) 我想使用matplotlib Basemap 绘制光栅tiff (下载 -723Kb).我的栅格投影坐标以米为单位:
In [2]:
path = r'albers_5km.tif'
raster = gdal.Open(path, gdal.GA_ReadOnly)
array = raster.GetRasterBand(20).ReadAsArray()
print ('Raster Projection:\n', raster.GetProjection())
print ('Raster GeoTransform:\n', raster.GetGeoTransform())
Out [2]:
Raster Projection:
PROJCS["unnamed",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["standard_parallel_1",15],PARAMETER["standard_parallel_2",65],PARAMETER["latitude_of_center",30],PARAMETER["longitude_of_center",95],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]]]
Raster GeoTransform:
(190425.8243, 5000.0, 0.0, 1500257.0112, 0.0, -5000.0)
Run Code Online (Sandbox Code Playgroud)
如果我试图用这个用罗宾投影绘制contourf与latlon=False比X和Y被认为是地图投影坐标(见文档,我想这就是我).
但如果我看一下情节,我会注意到它的左下角非常小:

使用此代码:
In [3]:
xy = raster.GetGeoTransform()
x = raster.RasterXSize
y = raster.RasterYSize
lon_start = xy[0]
lon_stop = x*xy[1]+xy[0]
lon_step = xy[1]
lat_start = xy[3]
lat_stop = y*xy[5]+xy[3]
lat_step = xy[5] …Run Code Online (Sandbox Code Playgroud) 我有一个世界的底图,它使用pcolormesh填充数据(lintrends_mean).因为数据有相对较大的网格框,我想平滑情节.但是,我无法弄清楚如何做到这一点.在绘图功能中设置着色='gouraud'会模糊网格框的边缘,但我想要一些比这更好看的东西,因为数据仍然显得斑点.
这里有一个类似的问题给出了答案,但我不明白答案,特别是"newdepth"的来源.由于我的声誉不足,我无法对其进行澄清澄清. 使用matplotlib pcolor进行插值
#Set cmap properties
bounds = np.array([0.1,0.2,0.5,1,2,3,4,6,9,13,20,35,50])
norm = colors.LogNorm(vmin=0.01,vmax=55) #creates logarithmic scale
#cmap.set_under('#000099') # I want to use this- edit in Paint
cmap.set_over('#660000') # everything above range of colormap
fig = plt.figure(figsize=(15.,10.)) #create figure & size
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,llcrnrlon=0,urcrnrlon=360.,lon_0=180.,resolution='c') #create basemap & specify data area & res
m.drawcoastlines(linewidth=1)
m.drawcountries(linewidth=1)
m.drawparallels(np.arange(-90,90,30.),linewidth=0.3)
m.drawmeridians(np.arange(-180.,180.,90.),linewidth=0.3)
meshlon,meshlat = np.meshgrid(lon,lat) #meshgrid turns lats & lons into 2D arrays
x,y = m(meshlon,meshlat) #assign 2D arrays to new variables
trend = m.pcolormesh(x,y,lintrends_mean,cmap=plt.get_cmap('jet'),norm=norm) #plot the …Run Code Online (Sandbox Code Playgroud) 我发现当作为堆栈安装的一部分安装Python时,Windows的底图(用于matplotlib和Python的模块)二进制安装程序无法检测系统上的Python,如Anaconda或WinPython.安装程序退出,而不是允许您指向安装目录.
因此我必须通过源安装.但是,我不知道这样做的方法.Readme.txt和安装说明似乎没有帮助.他们只是指示"首先安装geos-3.3.3" - 嗯,究竟是怎么回事?我没有在该目录中看到setup.py.
任何帮助都会很棒.(Python 2.7,Win 7,64b)
如何在tiff图像上绘制规则的网格线?我想在图像上为每个间隔(比如说100 x 100像素)绘制规则的正方形网格,并将其与图纸一起保存.我还需要在每个网格框的中间将每个网格ID覆盖为"1","2",....
有效的是
import mpl_toolkits
Run Code Online (Sandbox Code Playgroud)
什么不起作用(找不到导入错误底图)
from mpl_toolkits.basemap import Basemap
Run Code Online (Sandbox Code Playgroud)
我按照这里的说明操作:
http://matplotlib.org/basemap/users/installing.html
下载了最新的底图*.tar.gz
我运行以下命令:
在geos文件夹中
export GEOS_DIR=~/
./configure --prefix=$GEOS_DIR
make
make install
Run Code Online (Sandbox Code Playgroud)
在底图文件夹中
python setup.py install
Run Code Online (Sandbox Code Playgroud)
一切都以sudo模式运行,没有错误.Goes输出没有python绑定但不是错误所以我不确定.
似乎没有正确安装.
Mac Os X 10.10 Yosemiete Python 2.7.6
如果我输入
pip install basemap --allow-external basemap --allow-unverified basemap
Requirement already satisfied (use --upgrade to upgrade): basemap in /Library/Python/2.7/site-packages
Run Code Online (Sandbox Code Playgroud)
所以它存在但不可导入??????????
解决方案
如果你没有安装macports
port install py-matplotlib-basemap
Run Code Online (Sandbox Code Playgroud)
然后它安装了一大堆扩展.
之后你做:
端口选择列表python
然后它应该是:(如果没有尝试列表中的另一个)
sudo port select --set python python27