matplotlib之Basemap与PyQt4一例

有网友发消息提问:

我现在想做个小软件,软件上能够绘等值线(等值线在地图上),用到了basemap,需要将matplotlib的basemap嵌入到pyqt的画布中,查了很多资料,能够将pyqt的简单的xy坐标嵌入到pyqt中,但是不能够将basemap嵌入。不知道你能不能给点意见呢?

实在是惭愧,尽管简单看过一点点PyQt4和matplotlib,却连basemap是什么东西都不知道。

遇事不决,找google...

Basemap

简单说:它是matplotlib提供的用于在地图上绘制二维数据的工具。

  • The matplotlib basemap toolkit is a library for plotting 2D data on maps in Python. It is similar in functionality to the matlab mapping toolbox, the IDL mapping facilities, GrADS, or the Generic Mapping Tools. PyNGL and CDAT are other libraries that provide similar capabilities in Python.

安装

它不是matplotlib默认安装的一部分(源码竟然包竟然100M以上,难怪不被默认包含)。所以需要我们自己动手安装:

源码仓库:

https://github.com/matplotlib/basemap

通过git或者直接下载压缩的源码包。而后解压,查看README

我使用的Ubuntu 11.04,先安装一些东西

sudo apt-get install python-matplotlib swig python2.7-dev

而后按照安装说明:

  • 进入 GEOS 子目录
./configure --enable-python
make
sudo make install
  • 回到顶级目录
sudo python setup.py install

运行例子

按照README,运行例子确认安装是否成功,切换到examples目录,运行simpletest.py

python simpletest.py

嵌入到PyQt4

  • basemap 例子中有一个wxpython的例子 embedding_map_in_wx.py
  • 我们参考它写一个pyqt4的例子,先跑起来再说

 

代码如下:

"""
An example of how to use Basemap in pyqt4 application.

Copyright(C) 2011 dbzhang800#gmail.com
"""

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from mpl_toolkits.basemap import Basemap
from PyQt4 import QtGui

class Widget(FigureCanvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=100)
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
        self.axes = fig.add_subplot(111)

        map = Basemap(ax=self.axes)
        map.drawcoastlines()
        map.drawcountries()
        map.drawmapboundary()
        map.fillcontinents(color='coral', lake_color='aqua')
        map.drawmapboundary(fill_color='aqua')

        self.setWindowTitle("PyQt4 and Basemap -- dbzhang800")

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

参考

 

主要是为了写个代码,以后用得着时可以直接调用,文件里的类直接继承QWidget,可以作为部件放入Layout中,省的以后还要麻烦重复的写代码。本人气象行业,会用到地图叠加风羽。 ---------- 主要实现了以下功能: 1. 绘制正常的折线或散点图(可以多条折线) 2. 绘制色斑图(等高线图) 3. 将数组显示为图片(主要是自己要用于卫星云图显示) 4. 利用basemap,在地图地图上添加风羽(风杆) ---------- 暂时先实现这些功能,方便再写界面的时候直接调用。basemap没有python3.6版本的,所以用的是非官方包。 文件说明: 一、总体说明 A、类 文件里分为两个类:PlotWidget和PlotGeoWidget文件里分为两个类:```PlotWidget```和```PlotGeoWidget``` B、用到的库 1、matplotlib(2.0.2) 2、PyQt5(5.6) 3、basement(第三方非官方包) 4、numpy(1.14.5) 5、math(python自带) 二、PlotWidget类 A、描述 该类作为一个独立的QWidget部件,可以直接放入Layout中作为一个普通部件 B、方法 1、plot_lines 功能:绘制线型图像(可多条曲线) ```def plot_lines(self, x_data, y_data, xlim=None, ylim=None, linestyle=['-'], linewidth=[2], linecolor=['black'], xticks=None, xlabels=None, x_labels_rotation=0, x_labels_fontsize=20, yticks=None, ylabels=None, y_labels_rotation=0, y_labels_fontsize=20, x_name=None, y_name=None, title=None, label=[None], label_loc='upper right')``` 参数解释: x_data、y_data: 要画的数据 必须在数据外面再套一个[],应为可能会容纳多组数据 例如只有一组数据[1,2,3,4,5],也需要在外面加上[]变成[[1,2,3,4,5]] xlim、ylim: 坐标轴范围,元组类型 例如:(0,100) linestyle、linewidth、linecolor: 线型线宽线色,列表 列表里每个元素都是按照matplotlib的线型线宽线色来表示 xticks、yticks: 坐标轴上要显示的刻度位置,列表类型 例如:[0,10,20,30] 代表在只显示10 20 30的刻度 xlabels、ylabels: 坐标轴上显示刻度位置要显示的文字,列表类型 前提是必须有xticks、yticks 例如:当xticks=[0,10,20,30]时,xlabels=['x', 'xx', 'xxx', 'xxxx']代表在0 10 20 30 刻度处显示'x', 'xx', 'xxx', 'xxxx'文字 x_labels_rotation、x_labels_fontsize、y_labels_rotation、y_labels_fontsize: 坐标轴上文字旋转角度和文字大小 x_name、y_name: 坐标轴标注 title: 图片题名 label: 图注,列表类型 label_loc: 图注位置,按照matplotlib图注规范 2、plot_contour 功能:画等值线图 ```def plot_contour(self, x_data, y_data, val, title=None, x_name=None, y_name=None, xticks=None, xlabels=None, x_labels_rotation=0, x_labels_fontsize=20, yticks=None, ylabels=None, y_labels_rotation=0, y_labels_fontsize=20)``` 参数解释: x_data、y_data、val: 要画的数据(x,y,z值) title: 图片题名 x_name、y_name: 坐标轴标注 xticks、yticks: 坐标轴上要显示的刻度位置,列表类型 xlabels、ylabels: 坐标轴上显示刻度位置要显示的文字,列表类型 x_labels_rotation、x_labels_fontsize、y_labels_rotation、y_labels_fontsize: 坐标轴上文字旋转角度和文字大小 3、plot_digital_image 功能:显示数字图像,如云图、照片等,但是需要先将图片转为数组 ```def plot_digital_image(self, img)``` 参数解释: img: 图片的数组 三、PlotGeoWidget A、描述 该类作为一个独立的QWidget部件,可以直接放入Layout中作为一个普通部件 B、方法 1、map_wind 功能:显示本场周边地区地图,在地图上画出风杆 ```def map_wind(self, lon, lat, spe, dir)``` 参数解释: lon、lat: 经纬度,以小数表示 spe、dir: 风速风向
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值