标签: matplotlib-basemap

Python和Matplotlib以及鼠标悬停的注释

我正在使用此代码,当我点击底图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)

python annotations wxpython matplotlib matplotlib-basemap

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

如何使用设置剪裁路径为Basemap多边形

我想使用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)

python gis matplotlib shapefile matplotlib-basemap

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

底图热量错误/空图

我试图在定义的地理位置上绘制散布的热图.我可以很好地绘制一个没有背景的普通分散地图,但我想将它与给定的lat和lon结合起来.我得到以下空地图在此输入图像描述.

输入

输入:col[2]col[3]xy共同坐标与地理地点纬度: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)

python matplotlib matplotlib-basemap imshow

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

轮廓标签未显示

我试图在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)

python matplotlib matplotlib-basemap

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

python:拉伸世界地图

我正试图在世界地图上绘制一些坐标点.我使用圆柱投影如下:

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°]纬度范围,甚至失去我的投影的比例,以便缩放感兴趣的区域并扩大我的点之间的距离.我尝试限制llcrnrlaturcrnrlat参数,但只是裁剪了感兴趣的区域,没有缩放或放大图像.我怎样才能做到这一点?

点都是压缩的

python matplotlib matplotlib-basemap

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

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底图,如下图所示?在此输入图像描述

以下是生成地图的一些示例底图代码:

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)

python matplotlib-basemap

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

无法使用“ ax.add_collection3d(map.drawcoastlines())”将“ map.drawcoastline”添加到3d图形

所以我想用绘制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

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

在 spyder 中导入底图时出错

我正在尝试在 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 中导入它。有没有人有建议?提前致谢。

python windows spyder matplotlib-basemap

5
推荐指数
1
解决办法
2484
查看次数

从以底图位置为中心的 networkx 绘制图形

我正在寻找在地图上绘制多个子图,每个子图都以一个地理位置(或绘图的一个坐标)为中心。节点本身没有位置(或者它们都属于一个城市),但每个子图对应一个本地情况。

  • 我试图为每个子图只为一个节点分配一个位置,使用“居中”选项默认绘制其余的图
  • 我试图从/sf/answers/2071804661/ 中得到启发,在一个位置上绘制一个分层图,但没有成功

    # -*- 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] # …
    Run Code Online (Sandbox Code Playgroud)

python networkx pygraphviz matplotlib-basemap

5
推荐指数
1
解决办法
729
查看次数