python - 在实时图表中使用图例
问题描述
我有一个实时图表,可以更新并保留我想要的数据量。一切都按我的意愿工作,但阅读图表可能很困难,我怎样才能在其中添加一个图例,使其成为我的静态参考?我在一行中包含了一个标记,如果您运行我的代码,您将看到,它会在每次更新时为图例添加一个新条目。我只想将每个项目添加一次,然后图例保持静态
这是我的代码:
from matplotlib import pyplot
from matplotlib.animation import FuncAnimation
import pandas as pd
from datetime import datetime
import threading
import random
import time
measurements = ['abc','bcd','afr','reg','wow']
counter = 0
figure = pyplot.figure()
measurement_frame = pd.DataFrame(index = measurements)
def get_live(counter2, col_num):
measurement_frame.iat[counter2,col_num] = random.randint(50,80)
def add_to_dataframe():
global measurement_frame
timey = datetime.now().time()
if measurement_frame.shape[1] == 80:
time.sleep(4)
measurement_frame.drop(measurement_frame.columns[0], axis = 1, inplace = True)
measurement_frame[timey] = measurements
col_num = measurement_frame.shape[1]-1
counter2 = 0
for item in measurements:
t = threading.Thread(target=get_live, args=(counter2, col_num,))
t.start()
counter2 = counter2 +1
t.join()
def update(frame):
add_to_dataframe()
x_data = measurement_frame.columns
y1_data = measurement_frame.loc[measurement_frame.index[0]]
y2_data = measurement_frame.loc[measurement_frame.index[1]]
y3_data = measurement_frame.loc[measurement_frame.index[2]]
y4_data = measurement_frame.loc[measurement_frame.index[3]]
y5_data = measurement_frame.loc[measurement_frame.index[4]]
line, = pyplot.plot_date(x_data, y1_data, '-', color = 'b', label = measurements[0])
line2, = pyplot.plot_date(x_data, y2_data, '-', color = 'g')
line3, = pyplot.plot_date(x_data, y3_data, '-', color = 'r')
line4, = pyplot.plot_date(x_data, y4_data, '-', color = 'm')
line5, = pyplot.plot_date(x_data, y5_data, '-', color = 'y')
line.set_data(x_data, y1_data)
line2.set_data(x_data, y2_data)
line3.set_data(x_data, y3_data)
line4.set_data(x_data, y4_data)
line5.set_data(x_data, y5_data)
figure.gca().set_xlim(left =x_data[0], right = datetime.now().time())
return line, line2, line3, line4, line5,
animation = FuncAnimation(figure, update, interval=300)
pyplot.show()
解决方案
在这种情况下,我认为最好手动创建图例,而不是使用标记艺术家的自动检索。像这样的东西
from matplotlib.lines import Line2D
colors = ['b', 'g', 'r', 'm', 'y']
labels = ['1', '2', '3', '4', '5']
handles = [Line2D([], [], color=c, label=l) for c, l in zip(colors, labels)]
plt.legend(handles=handles)
update
函数之外。
推荐阅读
- angular-ui-router - 多租户的 NGX-ADMIN url
- python - Postgresql 服务器不监听本地主机
- javascript - ES6 - 导入常量,但使用时会抛出 Uncaught ReferenceError
- go - 在发送嵌套的 http 请求时不断获取 EOF
- javascript - 如何使用 javascript 中的 requestAnimationFrame() 减慢动画速度
- kubernetes - K8S:无法通过我的 Ingress 连接到 MinIO 服务
- firebase - 使用 Firestore 云函数计数
- python - Python Kivy 严重文本错误。无法找到任何有价值的文本提供者
- shiny - RStudio 的嵌入式浏览器不保存 cookie
- gitlab - GitLab Runner macOS 作业失败,无法调试