Matplotlib我正在创建一个使用和进行经济数据地理空间可视化的工具Basemap。
然而,现在,我想到的给我足够灵活性的唯一方法是每次我想要更改数据时创建一个新的底图。
以下是我正在使用的代码的相关部分:
class WorldMapCanvas(FigureCanvas):
def __init__(self,data,country_data):
self.text_objects = {}
self.figure = Figure()
self.canvas = FigureCanvas(self.figure)
self.axes = self.figure.add_subplot(111)
self.data = data
self.country_data = country_data
#this draws the graph
super(WorldMapCanvas, self).__init__(Figure())
self.map = Basemap(projection='robin',lon_0=0,resolution='c', ax=self.axes)
self.country_info = self.map.readshapefile(
'shapefiles/world_country_admin_boundary_shapefile_with_fips_codes', 'world', drawbounds=True,linewidth=.3)
self.map.drawmapboundary(fill_color = '#85A6D9')
self.map.fillcontinents(color='white',lake_color='#85A6D9')
self.map.drawcoastlines(color='#6D5F47', linewidth=.3)
self.map.drawcountries(color='#6D5F47', linewidth=.3)
self.countrynames = []
for shapedict in self.map.world_info:
self.countrynames.append(shapedict['CNTRY_NAME'])
min_key = min(data, key=data.get)
max_key = max(data, key=data.get)
minv = data[min_key]
maxv = data[max_key]
for key in self.data.keys():
self.ColorCountry(key,self.GetCountryColor(data[key],minv,maxv))
self.canvas.draw() …Run Code Online (Sandbox Code Playgroud) 对于我的作业,我应该使用 matplotlib 在地图上绘制 20 次飓风的轨迹。但是,当我运行代码时,出现错误:AssertionError:Grouper and axis must be the same length
这是我的代码:
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from PIL import *
fig = plt.figure(figsize=(12,12))
ax = fig.add_axes([0.1,0.1,0.8,0.8])
m = Basemap(llcrnrlon=-100.,llcrnrlat=0.,urcrnrlon=-20.,urcrnrlat=57.,
projection='lcc',lat_1=20.,lat_2=40.,lon_0=-60.,
resolution ='l',area_thresh=1000.)
m.bluemarble()
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
m.drawstates(linewidth=0.5)
# Creates parallels and meridians
m.drawparallels(np.arange(10.,35.,5.),labels=[1,0,0,1])
m.drawmeridians(np.arange(-120.,-80.,5.),labels=[1,0,0,1])
m.drawmapboundary(fill_color='aqua')
# Opens data file
import pandas as pd
name = [ ]
df = pd.read_csv('louisianastormb.csv')
for name, group in df.groupby([name]):
latitude = group.lat.values
longitude = group.lon.values …Run Code Online (Sandbox Code Playgroud) 是否有一种现成的方法可以从网格中心位置(红点)推断网格角位置(蓝点)?
我正在使用的网格不是矩形的,因此常规双线性插值似乎不是最好的方法;不过,这只是为了让我绘制我的数据使用情况pyplot.pcolormesh(),所以也许这并不重要。

网格数据示例:
import numpy as np
lons = np.array([[ 109.93299681, 109.08091365, 108.18301276, 107.23602539],
[ 108.47911382, 107.60397996, 106.68325946, 105.71386119],
[ 107.06790187, 106.17259769, 105.23214707, 104.2436463 ],
[ 105.69908292, 104.78633156, 103.82905363, 102.82453812]])
lats = np.array([[ 83.6484245 , 83.81088466, 83.97177823, 84.13098916],
[ 83.55459198, 83.71460466, 83.87294803, 84.02950188],
[ 83.4569054 , 83.61444708, 83.77022192, 83.92410637],
[ 83.35554612, 83.51060313, 83.6638013 , 83.81501464]])
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Windows 机器(64 位,Python34)上的 spyder 中导入底图,但出现以下错误:
from mpl_toolkits.basemap import Basemap
Traceback (most recent call last):
File "<ipython-input-6-5e6824321d57>", line 1, in <module>
from mpl_toolkits.basemap import Basemap
ImportError: No module named 'mpl_toolkits.basemap'
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我可以在 Python 的 IDLE 中很好地导入它。我只是无法在 Spyder 中导入它。有没有人有建议?提前致谢。
我正在尝试生成温度随时间变化的四面板动画。子图中的四个面板中的每一个都应该是一个动画地图;每个面板之间的差异在于所使用的数据。我已成功使用一组数据(没有子图)和以下代码生成动画:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.basemap import Basemap
#dummy temperature data with 10 time-steps
y=np.random.randn(10, 60, 100)
fig = plt.figure()
m = Basemap(projection='kav7',lon_0=0)
lats=np.linspace(90,-90,y.shape[1])
lons=np.linspace(-180,180,y.shape[2])
lons, lats = np.meshgrid(lons,lats)
m.drawparallels(np.arange(-90.,99.,30.), labels=[1,0,0,0])
m.drawmeridians(np.arange(-180.,180.,60.), labels=[0,0,0,1])
m.drawcoastlines(linewidth=0.25)
m.pcolormesh(lons,lats,y[0],cmap=plt.cm.bwr, shading='flat',latlon=True)
def init():
m
def animate(i):
m.pcolormesh(lons,lats,y[i],cmap=plt.cm.bwr, shading='flat',latlon=True)
return m
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=10, interval=100) #interval = number of milliseconds between frames
anim.save('movie.mp4')
Run Code Online (Sandbox Code Playgroud)
我想在绘制 netCDF 数据集中的数据时掩盖海洋。我遵循了这个问题的答案中给出的重要指示。它对半个世界都有效,但不知何故,格林威治以西的一切也都被遮盖了,无论是海洋还是陆地。这是我的代码:
import netCDF4
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import mpl_toolkits
from mpl_toolkits import basemap
from mpl_toolkits.basemap import Basemap, maskoceans
filename = 'myfile.nc'
vmin = 0.
vmax = 1
nc = netCDF4.Dataset(filename, 'r')
data = nc.variables['sum'][:]
lats_1d = nc.variables['lat'][:]
lons_1d = nc.variables['lon'][:]
lons, lats = np.meshgrid(lons_1d, lats_1d)
labels = ['DJF', 'MAM', 'JJA', 'SON']
cmap = cm.RdYlBu
cmap.set_over('#00FF00')
my_dpi = 96
fig = plt.figure(figsize=(1200/my_dpi, 800./my_dpi))
for season …Run Code Online (Sandbox Code Playgroud) 以下代码生成我想要的图像,但颜色条为空白/白色,并且与数据不匹配:
def plot_array(da, ax=None, shift=True):
"""plots an array of lat by lon on a coastline map"""
m = basemap.Basemap()
m.drawcoastlines()
m.pcolormesh(da.lon, y=da.lat, data=da.T, latlon=True)
return m
# 'monthly mean' is an xarray DataArray
fig = plt.figure(0, (14, 8))
grid = ImageGrid(fig, 111, nrows_ncols=(3, 4), axes_pad=0.3,
cbar_mode='single', cbar_location="bottom",)
for i, m in enumerate(months):
plt.sca(grid[i])
plot_array(monthly_mean.sel(month=i + 1))
plt.title(m)
plt.suptitle("{b} - {y} monthly means".format(b=benchmark, y=year))
# plt.colorbar()
plt.tight_layout()
os.makedirs("plots/monthly_means/{y}".format(y=year), exist_ok=True)
plt.savefig("plots/monthly_means/{y}/{b}_{y}.png".format(b=benchmark, y=year))
plt.close()
Run Code Online (Sandbox Code Playgroud)
我还需要做些什么才能使颜色条与 ImageGrid 一起工作,还是 ImageGrid 和 Basemap 不能很好地协同工作?
我尝试在 Python 中按如下方式导入底图:
from mpl_toolkits.basemap import Basemap
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Traceback (most recent call last):
File "<ipython-input-16-880204a64918>", line 2, in <module>
from mpl_toolkits.basemap import Basemap
File "C:\Users\bakhadher\AppData\Local\Continuum\anaconda3\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 155, in <module>
pyproj_datadir = os.environ['PROJ_LIB']
File "C:\Users\bakhadher\AppData\Local\Continuum\anaconda3\lib\os.py", line 678, in __getitem__
raise KeyError(key) from None
KeyError: 'PROJ_LIB'
Run Code Online (Sandbox Code Playgroud) 我曾经使用以下命令在Google colaboratory中安装libgeos和basemap,并且直到上周都可以正常工作。
!apt-get -qq install libgeos-dev
!pip install -qq https://github.com/matplotlib/basemap/archive/master.zip
from mpl_toolkits.basemap import Basemap, cm
Run Code Online (Sandbox Code Playgroud)
错误显示
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-f27b0fbc3a52> in <module>()
----> 1 from mpl_toolkits.basemap import Basemap, cm
2 from matplotlib.patches import Polygon
/usr/local/lib/python3.6/dist-packages/mpl_toolkits/basemap/__init__.py in
<module>()
150
151 # create dictionary that maps epsg codes to Basemap kwargs.
--> 152 epsgf = open(os.path.join(pyproj.pyproj_datadir,'epsg'))
153 epsg_dict={}
154 for line in epsgf:
AttributeError: module 'pyproj' has no attribute 'pyproj_datadir'
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决?谢谢。
我正在寻找在地图上绘制多个子图,每个子图都以一个地理位置(或绘图的一个坐标)为中心。节点本身没有位置(或者它们都属于一个城市),但每个子图对应一个本地情况。
我试图从/sf/answers/2071804661/ 中得到启发,在一个位置上绘制一个分层图,但没有成功
Run Code Online (Sandbox Code Playgroud)# -*- coding: utf-8 -*- import networkx as nx import pygraphviz import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap as Basemap G1 = nx.Graph() G1.add_edge('a', 'b', weight=0.6) G1.add_edge('a', 'c', weight=0.2) G1.add_edge('c', 'd', weight=0.1) G1.add_edge('c', 'e', weight=0.7) G1.add_edge('c', 'f', weight=0.9) G1.add_edge('a', 'd', weight=0.3) G2 = nx.Graph() G2.add_edge('a', 'b', weight=0.9) G2.add_edge('a', 'f', weight=0.5) G2.add_edge('c', 'd', weight=0.1) G2.add_edge('c', 'e', weight=0.4) G2.add_edge('c', 'f', weight=0.2) G2.add_edge('a', 'd', weight=0.1) edges = G.edges() weights = [G[u][v]['weight'] for u,v in edges] # …