Giả sử bạn có một biểu đồ phân tán scat = ax.scatter(...)
, thì bạn có thể
thay đổi vị trí
scat.set_offsets(array)
đâu array
là một N x 2
mảng có hình dạng của tọa độ x và y.
thay đổi kích thước
scat.set_sizes(array)
đâu array
là mảng kích thước 1D tính bằng điểm.
thay đổi màu sắc
scat.set_array(array)
đâu array
là mảng giá trị 1D sẽ được ánh xạ màu.
Đây là một ví dụ nhanh bằng cách sử dụng mô-đun hoạt ảnh .
Nó phức tạp hơn một chút so với hiện tại, nhưng điều này sẽ cung cấp cho bạn một khuôn khổ để thực hiện những điều kỳ diệu hơn.
(Mã được chỉnh sửa vào tháng 4 năm 2019 để tương thích với các phiên bản hiện tại. Đối với mã cũ hơn, hãy xem lịch sử sửa đổi )
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
class AnimatedScatter(object):
"""An animated scatter plot using matplotlib.animations.FuncAnimation."""
def __init__(self, numpoints=50):
self.numpoints = numpoints
self.stream = self.data_stream()
self.fig, self.ax = plt.subplots()
self.ani = animation.FuncAnimation(self.fig, self.update, interval=5,
init_func=self.setup_plot, blit=True)
def setup_plot(self):
"""Initial drawing of the scatter plot."""
x, y, s, c = next(self.stream).T
self.scat = self.ax.scatter(x, y, c=c, s=s, vmin=0, vmax=1,
cmap="jet", edgecolor="k")
self.ax.axis([-10, 10, -10, 10])
return self.scat,
def data_stream(self):
"""Generate a random walk (brownian motion). Data is scaled to produce
a soft "flickering" effect."""
xy = (np.random.random((self.numpoints, 2))-0.5)*10
s, c = np.random.random((self.numpoints, 2)).T
while True:
xy += 0.03 * (np.random.random((self.numpoints, 2)) - 0.5)
s += 0.05 * (np.random.random(self.numpoints) - 0.5)
c += 0.02 * (np.random.random(self.numpoints) - 0.5)
yield np.c_[xy[:,0], xy[:,1], s, c]
def update(self, i):
"""Update the scatter plot."""
data = next(self.stream)
self.scat.set_offsets(data[:, :2])
self.scat.set_sizes(300 * abs(data[:, 2])**1.5 + 100)
self.scat.set_array(data[:, 3])
return self.scat,
if __name__ == '__main__':
a = AnimatedScatter()
plt.show()
Nếu bạn đang sử dụng OSX và sử dụng phần phụ trợ OSX, bạn sẽ cần phải thay đổi blit=True
thành blit=False
trong phần FuncAnimation
khởi tạo bên dưới. Phần phụ trợ OSX không hoàn toàn hỗ trợ blush. Hiệu suất sẽ bị ảnh hưởng, nhưng ví dụ này sẽ chạy chính xác trên OSX khi bị tắt tính năng thổi.
Đối với một ví dụ đơn giản hơn, chỉ cập nhật màu sắc, hãy xem phần sau:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
def main():
numframes = 100
numpoints = 10
color_data = np.random.random((numframes, numpoints))
x, y, c = np.random.random((3, numpoints))
fig = plt.figure()
scat = plt.scatter(x, y, c=c, s=100)
ani = animation.FuncAnimation(fig, update_plot, frames=xrange(numframes),
fargs=(color_data, scat))
plt.show()
def update_plot(i, data, scat):
scat.set_array(data[i])
return scat,
main()