简体   繁体   English

使用matplotlib进行交互式/动画散点图

[英]Interactive/Animated scatter plotting with matplotlib

I want to animate the scatter plot based on the actual timestamp from the csv file (see below). 我想根据csv文件中的实际时间戳为散点图设置动画(请参见下文)。 I'm not so good with matplotlib and I know of the animation function and the ion()-function but I'm not sure how to implement it. 我对matplotlib不太满意,我知道动画函数和ion()函数,但是我不确定如何实现它。 I read this but it seemed very difficult to implement it in my way. 我读了这篇文章,但是用我的方式实现它似乎非常困难。 I have tried the code below but it only shows me every loop a new window with the actual data but I would like to have the animation in one window thanks in advance :): 我尝试了下面的代码,但是它只向我显示每个循环使用实际数据的新窗口,但我想在一个窗口中制作动画,谢谢:):

import pandas as pd
import matplotlib.pyplot as plt

start_time = 86930.00
end_time = 86934.00
df = pd.read_csv('Data.csv', delimiter=',')

for timestamp in range(int(start_time), int(end_time), 1):
    act_data = df.loc[df['timestamp'] == float(timestamp)]
    X = act_data.x
    Y = act_data.y
    plt.scatter(X, Y)
    plt.show()

Data.csv: Data.csv:

timestamp,id,x,y
86930.00,1,1155.53,7155.05
86930.00,2,3495.08,8473.46
86931.00,1,3351.04,6402.27
86931.00,3,3510.59,8021.62
86931.00,2,2231.04,6221.27
86931.00,4,3710.59,8111.62
86932.00,2,3333.01,6221.27
86932.00,1,3532.59,3178.62
86933.00,3,1443.01,2323.27
86933.00,4,5332.59,1178.62

It would be cool if I could color the blobs by ID but not necessary :). 如果我可以通过ID为blob着色,但不是必须的,那将很酷:)。

The quickest way to animate on the same axis is to use interactive plots, plt.ion 在同一轴上进行动画制作的最快方法是使用交互式绘图plt.ion

import pandas as pd
import matplotlib.pyplot as plt

start_time = 86930.00
end_time = 86934.00
df = pd.read_csv('Data.csv', delimiter=',')


fig, ax = plt.subplots(1,1)
plt.ion()
plt.show()

for timestamp in range(int(start_time), int(end_time), 1):
    act_data = df.loc[df['timestamp'] == float(timestamp)]
    X = act_data.x
    Y = act_data.y
    ax.scatter(X, Y)
    plt.pause(1.0)

Although, I suspect from your title you want something interactive, which you can also use a matplotlib slider widget . 虽然,我怀疑您的书名中需要互动的内容,也可以使用matplotlib 滑块控件 With you data, 有了您的数据,

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

start_time = 86930.00
end_time = 86934.00
df = pd.read_csv('Data.csv', delimiter=',')


fig, ax = plt.subplots(1,1)
plt.subplots_adjust(bottom=0.25)
sax = plt.axes([0.25, 0.1, 0.65, 0.03])
slide = Slider(sax, 'time', start_time, end_time, valinit=start_time)

#Initial plot
act_data = df.loc[df['timestamp'] == float(int(start_time))]
s, = ax.plot(act_data.x, act_data.y, 'o')

def update(timestamp):
    act_data = df.loc[df['timestamp'] == float(int(timestamp))]
    X = act_data.x
    Y = act_data.y

    #Update data based on slider
    s.set_xdata(X)
    s.set_ydata(Y)

    #Reset axis limits
    ax.set_xlim([X.min()*0.9,X.max()*1.1])
    ax.set_ylim([Y.min()*0.9,Y.max()*1.1])

    fig.canvas.draw()

slide.on_changed(update)
plt.show()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM