我在我的64位机器上安装了Anaconda(版本1.6.2).它附带了一组很棒的库,但我还需要Basemap,它是matlibplot的一部分,但它不包含在Anaconda安装中.我试图安装Basemap并将文件移动到Anacaonda\Lib\site-packages\mpl_toolkits目录中,因为它是mpl_toolkits库的一部分.但是,当我尝试运行脚本时,我不断收到错误:"没有名为_geoslib的模块""无法导入pyproj"
我找到了pyproj库.我需要它吗?我在哪里可以找到geoslib?我如何让Basemap工作?
这是我几个月前提出的一个问题,我仍在努力寻求解决方案.我的代码并排给我一个底图和一个等高线图(但是打印到文件只给出了轮廓图),但是我希望它们叠加.最好的解决方案是https://gist.github.com/oblakeobjet/7546272,但这并没有说明如何引入数据,当你从头开始在线学习时很难.如果没有非常善良的人,我希望解决方案很容易,因为改变一行代码并且有人可以提供帮助.我的代码
#!/usr/bin/python
# vim: set fileencoding=UTF8
import numpy as np
import pandas as pd
from matplotlib.mlab import griddata
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
#fig = plt.figure(figsize=(10,8)) #when uncommented draws map with colorbar but no contours
#prepare a basemap
m = Basemap(projection = 'merc',llcrnrlon = 21, llcrnrlat = -18, urcrnrlon = 34, urcrnrlat = -8, resolution='h')
# draw country outlines.
m.drawcountries(linewidth=0.5, linestyle='solid', color='k', antialiased=1, ax=None, zorder=None)
m.drawmapboundary(fill_color = 'white')
m.fillcontinents(color='coral',lake_color='blue')
parallels = np.arange(-18, -8, 2.)
m.drawparallels(np.arange(-18, …Run Code Online (Sandbox Code Playgroud) 我正试图围绕地球绘制一个卫星轨道.这就是我的目标:
我使用mpl_toolkits.mplot3d中的Axes3D函数创建了这个图.理想情况下,我想做的是用实际地球拓扑替换简单球体.
如果您不确定我的意思,请查看MATLAB实现:
http://uk.mathworks.com/matlabcentral/fileexchange/13823-3d-earth-example
Basemap包可能有帮助(特别是bluemarble()函数),但不幸的是我无法使它在3D对象上工作.还有一个类似的问题在这里,但在2D情节回答这个问题导致3D领域的投影.我想在3D绘图上使用3D球体,这样我就可以围绕它旋转.
有没有人知道另一个包/实现.或者有没有办法让Basemap与3D对象一起使用?
- -编辑 - -
有人问了同样的问题,但还没有人回答
我想知道如何在底图中创建一个弹出框.当我将鼠标悬停在某个位置时,它应该会触发弹出框.
这可能吗?
我需要在多边形内创建海面温度(SST)数据的填充等高线图,但我不确定最好的方法.我有三个包含X,Y和SST数据的1D数组,我使用以下内容绘制以创建附图:
p=PatchCollection(mypatches,color='none', alpha=1.0,edgecolor="purple",linewidth=2.0)
levels=np.arange(SST.min(),SST.max(),0.2)
datamap=mymap.scatter(x,y,c=SST, s=55, vmin=-2,vmax=3,alpha=1.0)
Run Code Online (Sandbox Code Playgroud)
我希望能够绘制这些数据作为填充轮廓(contourf而不是散射)被约束(剪切)多边形边界内(紫线).非常感谢有关如何实现这一目标的建议.

更新:
我最初尝试过griddata,但无法使其正常工作.但是,根据@eatHam提供的答案,我决定再试一次.当我选择方法'立方'时,我无法让我的scipy griddata工作,因为它一直悬挂在网格上,但是当我切换到matplotlib.mlab.griddata并使用'线性'插值时它起作用.掩盖边界的建议提供了一个非常粗略而不是我想要的精确解决方案.

我搜索了如何在matplotlib中剪辑轮廓的选项,我在这个链接上找到了@pelson的答案.我尝试了暗示的建议解决方案:"轮廓集本身没有set_clip_path方法,但您可以迭代每个轮廓集合并设置它们各自的剪辑路径".我的新的最终解决方案看起来像这样(见下图):
p=PatchCollection(mypatches,color='none', alpha=1.0,edgecolor="purple",linewidth=2.0)
levels=np.arange(SST.min(),SST.max(),0.2)
grid_x, grid_y = np.mgrid[x.min()-0.5*(x.min()):x.max()+0.5*(x.max()):200j,
y.min()-0.5*(y.min()):y.max()+0.5*(y.max()):200j]
grid_z = griddata(x,y,SST,grid_x,grid_y)
cs=mymap.contourf(grid_x, grid_y, grid_z)
for poly in mypatches:
for artist in ax.get_children():
artist.set_clip_path(poly)
ax.add_patch(poly)
mymap.drawcountries()
mymap.drawcoastlines()
mymap.fillcontinents(color='lightgrey',lake_color='none')
mymap.drawmapboundary(fill_color='none')
Run Code Online (Sandbox Code Playgroud)
在推断北方的极端边缘方面,这种解决方案也可以特别改进.关于如何真正"填充"完整多边形的建议值得赞赏.我也想了解为什么mlab工作和scipy没有.

我想在Basemap上绘制轨迹,并将国家标签(名称)显示为叠加层.
这是当前代码及其生成的映射:
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
path = "path\\to\\data"
animal_data = pd.DataFrame.from_csv(path, header=None)
animal_data.columns = ["date", "time", "gps_lat", "gps_long"]
# data cleaning omitted for clarity
params = {
'projection':'merc',
'lat_0':animal_data.gps_lat.mean(),
'lon_0':animal_data.gps_long.mean(),
'resolution':'h',
'area_thresh':0.1,
'llcrnrlon':animal_data.gps_long.min()-10,
'llcrnrlat':animal_data.gps_lat.min()-10,
'urcrnrlon':animal_data.gps_long.max()+10,
'urcrnrlat':animal_data.gps_lat.max()+10
}
map = Basemap(**params)
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color = 'coral')
map.drawmapboundary()
x, y = map(animal_data.gps_long.values, animal_data.gps_lat.values)
map.plot(x, y, 'b-', linewidth=1)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这导致地图:

这是迁徙鸟类的轨迹图.虽然这是一张非常好的地图(!),但我需要国家/地区名称标签,因此很容易确定这只鸟飞过的国家.
是否有直接添加国家/地区名称的方式?
我接近得到我想要的地图.Matplotlib的底图是伟大的,但海岸线太粗,当我放大.我可以读自然地球形状文件,并绘制出来,这是好多了...但是当我尝试和填充的多边形,我认为这是治疗所有的点属于单个多边形.如何迭代多边形并正确显示地图?
提前致谢!
这是代码:
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
%matplotlib inline
landColor, coastColor, oceanColor, popColor, countyColor = '#eedd99','#93ccfa','#93ccfa','#ffee99','#aa9955'
fig = plt.figure()
ax = fig.add_subplot(111)
s = 1900000
m = Basemap(projection='ortho',lon_0=-86.5,lat_0=30.3,resolution='l',llcrnrx=-s,llcrnry=-s,urcrnrx=s,urcrnry=s)
m.drawmapboundary(fill_color=oceanColor) # fill in the ocean
# generic function for reading polygons from file and plotting them on the map. This works with Natural Earth shapes.
def drawShapesFromFile(filename,facecolor,edgecolor,m):
m.readshapefile(filename, 'temp', drawbounds = False)
patches = [] …Run Code Online (Sandbox Code Playgroud) 从各种 来源获取想法,并结合我自己的想法,我试图创建一个动画地图,根据我的数据中的某些值显示国家的阴影.
基本过程是这样的:
这很好用.问题是它非常慢.我有可能超过100k的时间间隔(超过几个指标)我想要制作动画,并且我得到每帧的平均时间为15秒,并且当帧数越多时,它就越糟糕.按照这个速度,我的计算机上的cpu和内存可能需要数周才能生成单个动画.
我知道matplotlib的速度并不快(例如:1和2)但是我读到了人们以5 + fps的速度生成动画并且想知道我做错了什么的故事.
我做过的一些优化:
也许一个不太详细的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) 我试过了
pip3 install basemap
Run Code Online (Sandbox Code Playgroud)
但是底图似乎不在PyPI上.
有一个老问题,但它没有答案.
python3-dev已安装我不知道在哪里/如何获得GEOS(libgeos-dev?).我觉得我跟着README,并没有显示任何错误,但在尝试的第一线时,这
$ python3
>>> from mpl_toolkits.basemap import Basemap
Run Code Online (Sandbox Code Playgroud)
我明白了
ImportError: libgeos-3.3.3.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
它在
$ locate libgeos-3.3.3.so
/home/math/Downloads/basemap-1.0.7/geos-3.3.3/src/.libs/libgeos-3.3.3.so
/usr/local/lib/libgeos-3.3.3.so
Run Code Online (Sandbox Code Playgroud) 我正在尝试安装底图,使用它似乎效果很好,
conda install -c conda-forge basemap
Run Code Online (Sandbox Code Playgroud)
在anaconda提示中。但是,当我在jupyternotebook上输入此代码时,
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
Run Code Online (Sandbox Code Playgroud)
它显示了一个错误:
FileNotFoundError Traceback (most recent call last)
<ipython-input-2-4fc84cbcc854> in <module>()
1 import matplotlib.pyplot as plt
----> 2 from mpl_toolkits.basemap import Basemap
~\Documents\DataScience\data\lib\site-
packages\mpl_toolkits\basemap\__init__.py in <module>()
144
145 # create dictionary that maps epsg codes to Basemap kwargs.
--> 146 epsgf = open(os.path.join(pyproj.pyproj_datadir,'epsg'))
147 epsg_dict={}
148 for line in epsgf:
FileNotFoundError: [Errno 2] No such file or directory: 'epsg'
Run Code Online (Sandbox Code Playgroud) python ×9
matplotlib ×7
gis ×2
3d ×1
anaconda ×1
animation ×1
choropleth ×1
events ×1
geos ×1
installation ×1
pandas ×1
popup ×1
python-3.x ×1
ubuntu-16.04 ×1