python - 在 matplotlib 中绘制 "real size"图形(滚动条而不是缩放)

标签 python matplotlib

我在使用 matplotlib 绘图时遇到问题。我需要绘制一个表示 radio 资源及时分配的宽图。但是当时间段很大时,情节会缩小,我需要放大它以查看特定片段的内容。 我想要的是在不缩放(“实际大小”)的情况下绘制数据并使用滚动条水平(及时)滚动绘图。这可能吗?

最佳答案

这是来自 scipy 食谱的示例:

When plotting a very long sequence in a matplotlib canvas embedded in a wxPython application, it sometimes is useful to be able to display a portion of the sequence without resorting to a scrollable window so that both axes remain visible. Here is how to do so:

from numpy import arange, sin, pi, float, size

import matplotlib
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.figure import Figure

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self,parent, id, 'scrollable plot',
                style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER,
                size=(800, 400))
        self.panel = wx.Panel(self, -1)

        self.fig = Figure((5, 4), 75)
        self.canvas = FigureCanvasWxAgg(self.panel, -1, self.fig)
        self.scroll_range = 400
        self.canvas.SetScrollbar(wx.HORIZONTAL, 0, 5,
                                 self.scroll_range)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, -1, wx.EXPAND)

        self.panel.SetSizer(sizer)
        self.panel.Fit()

        self.init_data()
        self.init_plot()

        self.canvas.Bind(wx.EVT_SCROLLWIN, self.OnScrollEvt)

    def init_data(self):

        # Generate some data to plot:
        self.dt = 0.01
        self.t = arange(0,5,self.dt)
        self.x = sin(2*pi*self.t)

        # Extents of data sequence: 
        self.i_min = 0
        self.i_max = len(self.t)

        # Size of plot window:       
        self.i_window = 100

        # Indices of data interval to be plotted:
        self.i_start = 0
        self.i_end = self.i_start + self.i_window

    def init_plot(self):
        self.axes = self.fig.add_subplot(111)
        self.plot_data = \
                  self.axes.plot(self.t[self.i_start:self.i_end],
                                 self.x[self.i_start:self.i_end])[0]

    def draw_plot(self):

        # Update data in plot:
        self.plot_data.set_xdata(self.t[self.i_start:self.i_end])
        self.plot_data.set_ydata(self.x[self.i_start:self.i_end])

        # Adjust plot limits:
        self.axes.set_xlim((min(self.t[self.i_start:self.i_end]),
                           max(self.t[self.i_start:self.i_end])))
        self.axes.set_ylim((min(self.x[self.i_start:self.i_end]),
                            max(self.x[self.i_start:self.i_end])))

        # Redraw:                  
        self.canvas.draw()

    def OnScrollEvt(self, event):

     # Update the indices of the plot:
        self.i_start = self.i_min + event.GetPosition()
        self.i_end = self.i_min + self.i_window + event.GetPosition()
        self.draw_plot()

class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(parent=None,id=-1)
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True

if __name__ == '__main__':
    app = MyApp()
    app.MainLoop()
  • 示例需要wxPythonnumpymatplotlibpip install numpy matplotlib wxPython 安装它们。

来源:https://scipy-cookbook.readthedocs.io/items/Matplotlib_ScrollingPlot.html

关于python - 在 matplotlib 中绘制 "real size"图形(滚动条而不是缩放),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9258534/

相关文章:

python - 在 win7(R 2.12,Python 2.5)上安装 rpy2 时遇到问题

python - 格式化 float 列表

python - 如何处理 Django 嵌套模板标签

python - 如何在 v8 中的 openerp (odoo) 中创建 TreeView ?

python - 读取具有超过 1 个条目的列的数据

python - Pandas 的 Matplotlib 堆积直方图被一条奇怪的线切割

python - 将 3D Matplot 保存为交互式 HTML

python - 在Python中绘制numpy数组的值

python - 将 Elasticsearch 时间戳属性转换为秒

python - 根据用户输入终止包含 while 循环的多个进程