2012-07-23 12 views
18

Có cách tạo đồ thị động hay không. Ví dụ hiển thị cùng một biểu đồ, với các tham số khác nhau.Đồ thị động trong máy tính xách tay ipython

Ví dụ là máy tính xách tay SAGE, người ta có thể viết:

a = animate([circle((i,i), 1-1/(i+1), hue=i/10) for i in srange(0,2,0.2)], 
      xmin=0,ymin=0,xmax=2,ymax=2,figsize=[2,2]) 
a.show() 

Trả lời

7

Cập nhật: Tháng 1 năm 2014

Jake Vanderplas đã tạo ra một gói phần mềm dựa trên Javascript cho hình ảnh động matplotlib sẵn here. Sử dụng nó cũng đơn giản như:

# https://github.com/jakevdp/JSAnimation 
from JSAnimation import examples 
examples.basic_animation() 

Example of Jake's JSAnimation package

Xem his blog post cho một mô tả đầy đủ hơn và ví dụ. câu trả lời lịch sử (xem goger cho một sự điều chỉnh)

Có, bản cập nhật Javascript không giữ đúng khung hình ảnh nào, vì vậy không nhấp nháy, nhưng bạn có thể làm điều gì đó khá đơn giản sử dụng kỹ thuật này:

import time, sys 
from IPython.display import clear_output 
f, ax = plt.subplots() 

for i in range(10): 
    y = i/10*sin(x) 
    ax.plot(x,y) 
    time.sleep(0.5) 
    clear_output() 
    display(f) 
    ax.cla() # turn this off if you'd like to "build up" plots 
plt.close() 
+0

Bạn có thể thêm giá trị x hợp lý không? Tôi đã thử ví dụ của bạn với một phạm vi đơn giản (100) và numpy.arange (0, 2 * pi, 0,01), nhưng không tạo ra một đầu ra tốt đẹp. Ngoài ra có vẻ như bạn đang thiếu một số nhập khẩu để chạy mã này như là –

+0

Nhận xét này là một vài năm sau đó: ** để tránh nhấp nháy ** đặt 'clear_output (True)' (IPython 2.0.0) –

+0

Cảm ơn @eldad! Tôi nên cập nhật điều này một lần nữa :) –

9

Điều này có nhấp nháy khủng khiếp, nhưng ít nhất điều này tạo ra một âm mưu làm động cho tôi. Nó dựa trên Aron's, nhưng Aron không hoạt động như vậy.

import time, sys 
from IPython.core.display import clear_output 
f, ax = plt.subplots() 

n = 30 
x = array([i/10.0 for i in range(n)]) 
y = array([sin(i) for i in x]) 
for i in range(5,n): 
    ax.plot(x[:i],y[:i]) 
    time.sleep(0.1) 
    clear_output() 
    display(f) 
    ax.cla() # turn this off if you'd like to "build up" plots 
plt.close() 
5

Nếu bạn sử dụng máy tính xách tay IPython, v2.0 trở lên hỗ trợ interactive widgets. Bạn có thể tìm thấy sổ ghi chép ví dụ tốt here (bạn cần tải xuống và chạy từ máy của riêng mình để xem thanh trượt).

Về cơ bản, bản tóm tắt sẽ nhập xuống interact và sau đó chuyển một hàm, cùng với phạm vi cho các tham số. ví dụ: từ liên kết thứ hai:

In [8]: 
def pltsin(f, a): 
    plot(x,a*sin(2*pi*x*f)) 
    ylim(-10,10) 
In [9]: 
interact(pltsin, f=(1,10,0.1), a=(1,10,1)); 

này sẽ tạo ra một âm mưu với hai thanh trượt, cho fa.

+0

Tôi đang cố gắng để animate một loại khác nhau của điều trong một máy tính xách tay iPython và điều này trông giống như về giải pháp tốt nhất tôi đã tìm thấy cho đến nay. Có cách nào để làm cho nó hoạt hình tự động sao cho người dùng không bắt buộc phải thao túng thanh trượt? – Addem

+0

Tôi không nghĩ rằng nó tầm thường để làm điều này. Nhưng hãy xem trang 'sự kiện': có một ví dụ cho các widget điều khiển theo chương trình, sử dụng các cuộc gọi lại. Vì vậy, về lý thuyết, bạn có thể có một nút, mà khi nhấp vào chỉ cần chạy một vòng lặp 'for' điều chỉnh thanh trượt/điều khiển và ngủ ở giữa. Điều đó sẽ có tác dụng của ai đó 'trượt' điều khiển bằng tay. Nhưng nó không lý tưởng. – Luciano

5

IPython widgets cho phép bạn thao tác các đối tượng Python trong hạt nhân với các đối tượng GUI trong Notebook. Bạn cũng có thể thích Sage hosted IPython Notebooks. Một vấn đề mà bạn có thể gặp phải khi chia sẻ các widget hoặc tương tác trong Notebook là nếu ai đó không có IPython, chúng không thể chạy công việc của bạn. Để giải quyết điều đó, bạn có thể sử dụng Domino để share Notebooks với các tiện ích mà người khác có thể chạy.

Dưới đây là ba ví dụ về các tiện ích bạn có thể tạo trong Notebook bằng cách sử dụng gấu trúc để lọc dữ liệu, fractal và thanh trượt cho ô 3D. Tìm hiểu thêm và xem mã và Sổ tay here.




enter image description here




enter image description here




enter image description here




Nếu bạn muốn phát trực tiếp dữ liệu hoặc thiết lập một mô phỏng để chạy như một vòng lặp, bạn cũng stream data thành lô trong một Máy tính xách tay có thể . Disclaimer: Tôi làm việc cho Plotly.

0

Nhận xét của @ goger về 'khủng khiếp kinh khủng', tôi thấy rằng việc gọi clear_output (wait = True) đã giải quyết được sự cố của tôi. Lá cờ cho clear_output chờ đợi để render cho đến khi nó có cái gì đó mới để render.

1

bqplot là một tùy chọn thực sự tốt để thực hiện việc này ngay bây giờ. xây dựng của nó đặc biệt dành cho phim hoạt hình thông qua python trong máy tính xách tay

https://github.com/bloomberg/bqplot

0

matplotlib có mô-đun animation để thực hiện điều đó. Tuy nhiên, các ví dụ được cung cấp trên trang web sẽ không chạy như trong sổ ghi chép; bạn cần phải thực hiện một vài chỉnh sửa để làm cho nó hoạt động.

Dưới đây là ví dụ về trang bên dưới được sửa đổi để hoạt động trong sổ ghi chép (sửa đổi trong đậm).


import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.animation import FuncAnimation 
from matplotlib import rc from IPython.display import HTML 

fig, ax = plt.subplots() 
xdata, ydata = [], [] 
ln, = plt.plot([], [], 'ro', animated=True) 

def init(): 
    ax.set_xlim(0, 2*np.pi) 
    ax.set_ylim(-1, 1) 
    return ln, 

def update(frame): 
    xdata.append(frame) 
    ydata.append(np.sin(frame)) 
    ln.set_data(xdata, ydata) 
    return ln, 

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128), init_func=init, blit=True) rc('animation', html='html5') ani # plt.show() # not needed anymore 

Lưu ý rằng hoạt ảnh trong sổ tay được thực hiện qua phim và bạn đã cấu hình để sử dụng ffmpeg và matplotlib.