8

I want to plot data where x axis is long. If I plot the whole x axis then the plot shrinks and it is almost unreadable. I've found this answer on SO which points to following scipy/matplotlib code. But When I try to run the mentioned code I get following error:

Traceback (most recent call last):
  File "scrollingPlot.py", line 88, in <module>
    app = MyApp()
  File "/usr/lib/python2.7/dist-packages/wx-3.0-gtk2/wx/_core.py", line 8628, in __init__
    self._BootstrapApp()
  File "/usr/lib/python2.7/dist-packages/wx-3.0-gtk2/wx/_core.py", line 8196, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "scrollingPlot.py", line 82, in OnInit
    self.frame = MyFrame(parent=None,id=-1)
  File "scrollingPlot.py", line 21, in __init__
    self.scroll_range)
  File "/usr/lib/python2.7/dist-packages/wx-3.0-gtk2/wx/_core.py", line 11226, in SetScrollbar
    return _core_.Window_SetScrollbar(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "sb" failed at ../src/gtk/window.cpp(4754) in SetScrollbar(): this window is not scrollable

PS: Other solutions are also welcomed (preferably python, R, or something simple and multi platform)

PPS: I've opened the issue for mentioned error

2 Answers 2

18

Have you considered using matplotlib slider widgets?

Here is a little code just to show as example

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)

t = np.arange(0.0, 100.0, 0.1)
s = np.sin(2*np.pi*t)
l, = plt.plot(t,s)
plt.axis([0, 10, -1, 1])

axcolor = 'lightgoldenrodyellow'
axpos = plt.axes([0.2, 0.1, 0.65, 0.03], facecolor=axcolor)

spos = Slider(axpos, 'Pos', 0.1, 90.0)

def update(val):
    pos = spos.val
    ax.axis([pos,pos+10,-1,1])
    fig.canvas.draw_idle()

spos.on_changed(update)

plt.show()
Sign up to request clarification or add additional context in comments.

Comments

-1

In R this answer could help you. It will save the plot as a separate png, but you can change the format type with a different command. The relevant code from that answer is reproduced:

 png("wide.png", width = 1e5, height = 500)
 plot((sin(1:10000/100)+rnorm(10000)/5),type='l')
 dev.off()
 #bmp("wide.bmp", width = 1e5, height = 500)
 #plot((sin(1:10000/100)+rnorm(10000)/5),type='l')
 #dev.off()
 #note that the png has a size of 396 KB, while the bmp has 48,830 KB.

1 Comment

Thank you, this is interesting idea. It might come handy if matplotlib is not available otherwise the @Noel Segura solution seems fine.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.