我正在使用此代码,当我点击底图Matplotlib图中的一个点时,会在地图上弹出注释.
dcc = DataCursor(self.figure.gca())
self.figure.canvas.mpl_connect('pick_event',dcc)
plot_handle.set_picker(5)
self.figure.canvas.draw()
class DataCursor(object):
import matplotlib.pyplot as plt
text_template = 'x: %0.2f\ny: %0.2f'
x, y = 0.0, 0.0
xoffset, yoffset = -20 , 20
text_template = 'A: %s\nB: %s\nC: %s'
def __init__(self, ax):
self.ax = ax
self.annotation = ax.annotate(self.text_template,
xy=(self.x, self.y), xytext=(0,0),
textcoords='axes fraction', ha='left', va='bottom', fontsize=10,
bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=1),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0')
)
self.annotation.set_visible(False)
self.annotation.draggable()
def __call__(self, event):
self.event = event
self.x, self.y = event.mouseevent.xdata, event.mouseevent.ydata
if self.x is not None:
glim = pickle.load(open("ListA.py","rb"))
tlim …Run Code Online (Sandbox Code Playgroud) 我想使用imshow(例如)在一个国家的边界内显示一些数据(为了我的例子,我选择了美国)下面的简单例子说明了我想要的:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon
data = np.arange(100).reshape(10, 10)
fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(data)
poly = RegularPolygon([ 0.5, 0.5], 6, 0.4, fc='none',
ec='k', transform=ax.transAxes)
im.set_clip_path(poly)
ax.add_patch(poly)
ax.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果是:

现在我想这样做但不是简单的多边形,我想使用美国的复杂形状.我已经创建了一些包含在"Z"数组中的示例数据,如下面的代码所示.我希望使用colourmap显示这些数据,但仅限于美国大陆的边界.
到目前为止,我已尝试过以下内容.我从一个形状文件这里包含在"nationp010g.shp.tar.gz"我用的底图模块在python绘制美国.请注意,这是我找到的唯一方法,它使我能够获得我需要的区域的多边形.如果有其他方法,我也会对它们感兴趣.然后我创建一个名为"mainpoly"的多边形,它几乎是我想要用蓝色着色的多边形:

请注意,只有一个物体被着色,所有其他不相交的多边形保持白色:

因此,蓝色区域几乎是我想要的,请注意加拿大附近有不必要的边界线,因为边界实际上穿过了一些湖泊,但这是一个小问题.真正的问题是,为什么我的imshow数据不在美国境内显示?比较我的第一个和第二个示例代码,我无法理解为什么我在第二个示例中没有得到修剪的imshow,就像我在第一个示例中所做的那样.在理解我所缺少的内容时,我们将不胜感激.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.patches import Polygon
# Lambert Conformal map of lower 48 states.
m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,
projection='lcc',lat_1=33,lat_2=45,lon_0=-95)
shp_info = m.readshapefile('nationp010g/nationp010g', …Run Code Online (Sandbox Code Playgroud) 我试图在定义的地理位置上绘制散布的热图.我可以很好地绘制一个没有背景的普通分散地图,但我想将它与给定的lat和lon结合起来.我得到以下空地图
.
输入
输入:col[2]和col[3]是x和y共同坐标与地理地点纬度:19.997453,经度:73.789802
000000000023 61.0 19.006113 73.009168
000000000054 65.0 19.009249 73.000342
000000000003 19.0 19.001051 73.000080
000000000012 20.0 19.009390 73.008638
000000000061 82.0 19.008550 73.003605
000000000048 86.0 19.006597 73.001057
00000000005d 60.0 19.003857 73.009618
000000000006 60.0 19.003370 73.009112
000000000037 91.0 19.002558 73.000546
000000000047 32.0 19.006061 73.008239
Run Code Online (Sandbox Code Playgroud)
程序
from matplotlib import pyplot as plt
from matplotlib import cm as CM
from matplotlib import mlab as ml
from mpl_toolkits.basemap import Basemap
import numpy …Run Code Online (Sandbox Code Playgroud) 我试图在matplotlib的填充等高线图上叠加轮廓以获得一些大气数据.但是,我的轮廓标签并不总是出现在屏幕上.以下是一个例子:

如您所见,轮廓标签仅出现在最里面的几个轮廓上.
知道我的轮廓范围早先被定义为
list(range(950,1052,4))
Run Code Online (Sandbox Code Playgroud)
我有以下代码来实际绘图:
parallels = np.arange(0.,90,5.)
basem.drawparallels(parallels,labels=[1,0,0,0],fontsize=10)
# draw meridians
meridians = np.arange(180.,360.,5.)
basem.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10)
basem.drawstates()
basem.drawcountries()
if clevs != 0:
cs = basem.contourf(x,y, plotted_var, clevs)
cl = basem.contour(x,y, plotted_var, clevsl, colors='k')
plt.clabel(cl, fmt="%1.0f", fontsize=8)
else:
cs = basem.contourf(x,y, plotted_var, cmap=plt.get_cmap(colorbar),
vmin = vmin, vmax = vmax)
cbar = basem.colorbar(cs, location='bottom', pad = "5%")
cbar.set_label(units)
Run Code Online (Sandbox Code Playgroud)
另外,我的底图定义是:
basem = Basemap(width=5800000,height=3000000,
rsphere=(6378137.00,6356752.3142),\
resolution='h',area_thresh=1000.,projection='lcc',\
lat_1=45.,lat_2=55,lat_0=40,lon_0=-102.)
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是只是我缺少的东西?如果可以的话,我试图避免使用手册.
输入数据是全局数据集(GFS天气模型).x,y通过以下方式获得:
lons2, lats2 = np.meshgrid(lons, lats)
x,y = basem(lons2, lats2)
Run Code Online (Sandbox Code Playgroud)
其中lons,lats是:
lons = [0.0, 0.25, 0.5, …Run Code Online (Sandbox Code Playgroud) 我正试图在世界地图上绘制一些坐标点.我使用圆柱投影如下:
fig = plt.figure(figsize=(18,6))
map = Basemap(projection='cyl', lat_0 = 57, lon_0 = -135, resolution = 'c', area_thresh = 0.1, llcrnrlon=-180.0, llcrnrlat=-7.0, urcrnrlon=180.0, urcrnrlat=7.0)
X, Y = map(LON, LAT)
map.plot(X, Y, "ro", markersize=5)
Run Code Online (Sandbox Code Playgroud)
问题在于我的点(大约1000)都包含在[-3°:-3°]纬度范围内,并且一旦在整个世界地图中绘制,它们都被挤压到赤道附近的紧线.
因此,我想"拉伸",比如说,[-5°:+ 5°]纬度范围,甚至失去我的投影的比例,以便缩放感兴趣的区域并扩大我的点之间的距离.我尝试限制llcrnrlat和urcrnrlat参数,但只是裁剪了感兴趣的区域,没有缩放或放大图像.我怎样才能做到这一点?
我试图在使用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
以下是生成地图的一些示例底图代码:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 4.5))
plt.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.00)
m = Basemap(projection='robin',lon_0=0,resolution='c')
m.fillcontinents(color='gray',lake_color='white')
m.drawcoastlines()
plt.savefig('world.png',dpi=75)
Run Code Online (Sandbox Code Playgroud) 所以我想用绘制3d地图matplotlib basemap。但是会弹出错误消息。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.basemap import Basemap
from matplotlib.collections import PolyCollection
import numpy as np
map = Basemap(llcrnrlon=-20,llcrnrlat=0,urcrnrlon=15,urcrnrlat=50,)
fig = plt.figure()
ax = Axes3D(fig)
#ax.set_axis_off()
ax.azim = 270
ax.dist = 7
polys = []
for polygon in map.landpolygons:
polys.append(polygon.get_coords())
lc=PolyCollection(polys,edgecolor='black',facecolor='#DDDDDD',closed=False)
ax.add_collection3d(lc)
ax.add_collection3d(map.drawcoastlines(linewidth=0.25))
ax.add_collection3d(map.drawcountries(linewidth=0.35))
lons = np.array([-13.7, -10.8, -13.2, -96.8, -7.99, 7.5, -17.3, -3.7])
lats = np.array([9.6, 6.3, 8.5, 32.7, 12.5, 8.9, 14.7, 40.39])
cases = np.array([1971, 7069, 6073, 4, …Run Code Online (Sandbox Code Playgroud) visualization data-visualization matplotlib matplotlib-basemap
我正在尝试在 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 中导入它。有没有人有建议?提前致谢。
我正在寻找在地图上绘制多个子图,每个子图都以一个地理位置(或绘图的一个坐标)为中心。节点本身没有位置(或者它们都属于一个城市),但每个子图对应一个本地情况。
我试图从/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] # …
python ×9
matplotlib ×6
annotations ×1
gis ×1
imshow ×1
netcdf ×1
networkx ×1
pygraphviz ×1
python-2.7 ×1
shapefile ×1
spyder ×1
windows ×1
wxpython ×1