首页 > 解决方案 > 使用 Matplotlib 是否可以从实时数据中注释最新的数据点?

问题描述

我目前正在从事一个爱好项目,并被困在 Matplotlib 中的注释上。

我有 2 个 Python 文件,一个从 yahoo 和当前时间抓取股票的当前价格。然后将此信息写入 csv:

from yahoo_fin import stock_info as si
import csv
import random
import time
from datetime import datetime


fieldnames = ['MSFTPrice', 'CurrentTime']

with open('MSFT.csv', 'w') as csv_file:
    csv_writer = csv.DictWriter(csv_file, delimiter=',', lineterminator='\n', fieldnames= fieldnames)
    csv_writer.writeheader()
count = 0
while True:
    with open('MSFT.csv', 'a') as csv_file:
        csv_writer = csv.DictWriter(csv_file, delimiter=',', lineterminator='\n', fieldnames= fieldnames)

        MSFTPrice = si.get_live_price("MSFT")
        count += 1.0
    
        now = datetime.now()

        CurrentTime = now.strftime("%H:%M:%S")

        info = {
            "MSFTPrice": '%.2f' %MSFTPrice,
            "CurrentTime": CurrentTime}

        csv_writer.writerow(info)

        print('%.2f'%MSFTPrice, CurrentTime)
    
        time.sleep(1)
    
        if count >= 10000:
            break

所以第二个是读取这两个值,然后使用 matplotlib 创建一个实时可视化:

import pandas as pd
import matplotlib.pyplot as plt 
from matplotlib.animation import FuncAnimation


plt.style.use('fivethirtyeight')

plt.style.use('dark_background')

def animate(i):
    data = pd.read_csv('MSFT.csv')
    x = data ["CurrentTime"]
    y = data ["MSFTPrice"]

    plt.cla()

    plt.xlabel('Time')
    plt.ylabel('Price')

    plt.plot(x, y, color= 'green', linewidth=1.5)
    plt.xticks(x[::300],fontsize= 12,  rotation='horizontal')

    for i,j in zip(x,y):
        plt.annotate (str(j), xy = (i,j))


    plt.tight_layout()

    plt.grid(b=None)

ani = FuncAnimation(plt.gcf(), animate, interval=1000)

plt.tight_layout()
plt.show()

我只想注释 csv 中的最新数据点,但目前它注释所有数据点。这是它现在的样子的屏幕截图: Plot

希望你能帮我 :)

标签: pythonpandasmatplotlib

解决方案


您可以替换以下内容(注释循环中的所有点):

for i,j in zip(x,y):
    plt.annotate (str(j), xy = (i,j))

使用注释最新点 ( x[-1], y[-1]) 的语句:

plt.annotate(str(y[-1]), xy=(x[-1], y[-1]))

推荐阅读