wxPython、PyQwt 或 C# 用于绘制图形并在绘图上手动绘制线条

Posted

技术标签:

【中文标题】wxPython、PyQwt 或 C# 用于绘制图形并在绘图上手动绘制线条【英文标题】:wxPython, PyQwt or C# for plotting graph and manually drawing lines on plot 【发布时间】:2012-04-11 21:01:48 【问题描述】:

我想开发一个 GUI 应用程序,让我可以绘制烛台柱,然后在绘图上手动绘制线条。

我在 Linux 上工作,所以更喜欢跨平台的解决方案,或者至少在 Linux 上运行。我经常使用 Python,并且过去使用过 C#(在 Linux 上使用 mono)。我做了一些研究,似乎表明 wxPython 或 PyQwt(都与 matplotlib 一起使用)将是可行的方法。我不得不承认我对 Python 有偏见,因为我现有的很多脚本都是用 Python 编写的。但是,C# 有一个很好的 GUI 库,如果它在这种情况下是更好的工具,那么我愿意使用它而不是基于 Python 的解决方案。

申请要求如下:

    绘制烛台 在光标移动时显示鼠标下的坐标 左右滚动绘图 放大/缩小 调整窗口大小时重绘绘图 更改绘图的粒度 在图表上手动绘制线条(针对当前粒度) 在绘图上显示/隐藏特定粒度的线条 以编程方式访问手动绘制的线条 将绘图作为图像保存到文件

由于 wxPython、PyQwt 和 C#(一般来说)对我来说是新的,我想知道哪些:

是实现上述要求的最佳方法 代表最浅的学习曲线

显示准系统骨架的 sn-p 以帮助我入门(使用 wxPython、pyQt、pyQwt 或 C#)将非常有帮助。

【问题讨论】:

它在任何标准的 GUI 库中都是可行的,我认为使用哪一个并不重要。它们通常提供类似的工具和界面。我最近使用了 matplotlib,它可能满足您的所有需求。 【参考方案1】:

wxPython 中的快速简单示例:

import wx
import math
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas

class Graph(wx.Panel):
    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        self.figure = Figure()
        self.canvas = FigureCanvas(self, -1, self.figure)
        self.Bind(wx.EVT_SIZE, self.OnSize)

    def OnSize(self, event):
        size = self.GetSize()
        self.canvas.SetSize(size)

    def Draw(self):
        self.figure.clear()
        self.subplot = self.figure.add_subplot(111)
        x = [a*(math.pi/50) for a in range(100)]
        y = [self.f(a) for a in x]
        self.subplot.plot(x, y)
        self.canvas.draw()

    def DrawCosine(self, e):
        self.f = math.cos
        self.Draw()

    def DrawSine(self, e):
        self.f = math.sin
        self.Draw()        


class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.panel = wx.Panel(self)
        self.button1 = wx.Button(self.panel, label="Sine")
        self.button2 = wx.Button(self.panel, label="Cosine")
        self.graph = Graph(self.panel)
        self.graph.DrawSine(None)

        self.button1.Bind(wx.EVT_BUTTON, self.graph.DrawSine)
        self.button2.Bind(wx.EVT_BUTTON, self.graph.DrawCosine)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer2 = wx.BoxSizer()

        self.sizer.Add(self.graph, 1, wx.ALL | wx.EXPAND)
        self.sizer2.Add(self.button1, 1, wx.ALL | wx.EXPAND)
        self.sizer2.Add(self.button2, 1, wx.ALL | wx.EXPAND)
        self.sizer.Add(self.sizer2, 0, wx.ALL | wx.EXPAND)

        self.panel.SetSizerAndFit(self.sizer)  
        self.Show()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

但根据您的要求,使用(或稍微重新设计)pyplot 就足够了:

import wx
import math
from matplotlib import pyplot

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.panel = wx.Panel(self)
        self.button1 = wx.Button(self.panel, label="Sine")
        self.button2 = wx.Button(self.panel, label="Cosine")

        self.button1.Bind(wx.EVT_BUTTON, self.DrawSine)
        self.button2.Bind(wx.EVT_BUTTON, self.DrawCosine)

        self.sizer = wx.BoxSizer()

        self.sizer.Add(self.button1)
        self.sizer.Add(self.button2)

        self.panel.SetSizerAndFit(self.sizer)  
        self.Show()

    def Draw(self):
        x = [a*(math.pi/50) for a in range(100)]
        y = [self.f(a) for a in x]
        pyplot.plot(x, y)
        pyplot.grid(True, which='both', axis="both")
        pyplot.show()

    def DrawCosine(self, e):
        self.f = math.cos
        self.Draw()

    def DrawSine(self, e):
        self.f = math.sin
        self.Draw() 

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

【讨论】:

感谢您的代码。至少我知道从哪里开始。我现在已经安装了 wxPython。现在乐趣开始了...... :) 顺便说一句,当单击任何按钮时,第二个 sn-p 中的代码会导致 SEGV。 奇怪,它在 Windows XP 上运行良好。你有什么操作系统?你能找出导致崩溃的那一行吗? 操作系统:Windows-XP-5.1.2600-SP3,Python:2.7.1,wxPython:2.8.12.1,Matplotlib:1.1.0 操作系统:Linux (Ubuntu 10.0.4 LTS)。 Python:2.6.5,matplotlib:1.2.x【参考方案2】:

wxpython 更适合您的目的。有一个非常好的教程,涵盖了大部分基础知识here。

【讨论】:

以上是关于wxPython、PyQwt 或 C# 用于绘制图形并在绘图上手动绘制线条的主要内容,如果未能解决你的问题,请参考以下文章

PyQwt QwtPlot 慢

在 WxPython 面板中嵌入 Seaborn 图

通过鼠标使用 PyQwt 从画布上记录曲线/多边形

如何使用 matplotlib blitting 将 matplot.patches 添加到 wxPython 中的 matplotlib 图?

在 matplotlib 图中绘制 SVG(嵌入在 wxPython 中)

架构 x86_64 的未定义符号:“hex(QTextStream&)”,引用自:(在 Mac 上安装 PyQwt-5.2.0)