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_())

参考

 

这个任务需要使用Pythonmatplotlib和pyqt5库。下面是一个基本的示例代码,可以根据给定的坐标绘制一个简单的图形。 ``` import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import Qt class MyWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('My Window') self.setGeometry(100, 100, 800, 600) # 创建一个matplotlib的Figure对象 self.fig = plt.figure(figsize=(6, 6), dpi=100) # 在Figure对象添加一个Axes对象 self.ax = self.fig.add_subplot(111) # 绘制图形 x = [1, 2, 3, 4, 5] y = [3, 5, 2, 7, 4] self.ax.plot(x, y) # 将Figure对象显示在窗口 self.canvas = FigureCanvas(self.fig) self.setCentralWidget(self.canvas) self.show() if __name__ == '__main__': app = QApplication([]) window = MyWindow() app.exec_() ``` 在这个代码,我们创建了一个继承自QMainWindow的窗口类MyWindow。在MyWindow的构造函数,我们首先设置了窗口的标题和大小。然后,我们创建了一个matplotlib的Figure对象,并在其添加了一个Axes对象。我们使用plot函数绘制了一个简单的图形,并将Figure对象显示在窗口。最后,我们启动了应用程序的事件循环。 需要注意的是,我们必须使用Qt的FigureCanvas类将matplotlib的Figure对象嵌入到PyQt5的窗口。此外,我们需要确保我们在主线程运行应用程序的事件循环,否则可能会出现一些奇怪的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值