matplotlib has a function that allows you to "animate" which basically updates the chart in fixed time intervals (don't try to update faster than 100FPS, aka 10mS since it'll lag and become unusable. If you have a 60Hz monitor, 16mS should be plenty fast enough).
If you're ok with that limitation then it's really easy to show the last N samples, but if you want proper scope functionality (trigger, x time / division, etc) it'd be nightmare to implement.
Assuming you just want to show the last N samples and the new data is added to a list called buffer:
data = data + buffer
data = data[len(data)-N:]
buffer = []
if you use numpy arrays it's a lot more efficient when you try to do FFT but you need to use the .stack (or if you already know the shapes of the matrices, either hstack or vstack, depending on how you're structuring the data) in order to add them together, otherwise if you just do A + B on a numpy array, it just adds the elements of the two arrays together instead of appending them.
For the time issue: your best bet is to encode the time data and send it over serial too, for example I know arduino has a millis and micros function that returns you the elapsed time. I'm sure when you send that over, adding or removing some offset and then doing cumulative sum (np.cumsum) allows you to get actual time for your x axis.