У меня есть код, который генерирует накладывающуюся / наложенную диаграмму Ганта с осью х, равной time values
, и вертикальной красной линией, представляющей current time
.
В моей текущей настройке мой график генерируется из двух фреймов данных (df и df1), и один из них (df1) будет постоянно обновляться каждый час или около того (другой фрейм данных остается неизменным c на протяжении всего день и изменить только один раз в конце его). Я хотел бы сохранить свой график в папке, и я хочу, чтобы он автоматически заменялся обновленным графиком через запланированные интервалы. Чтобы было понятно, я хочу, чтобы он обновил / перерисовал график и заменил старый файл PNG в папке на новый график.
Я знаю, что есть функция savefig
, но она только один раз сохраняет мой текущий график без замены старого. Я гуглил по сети, но не смог найти подходящего решения. Я даже не уверен, возможно ли это. Если это не так, я был бы очень признателен, если бы вы могли посоветовать альтернативное решение для автоматического обновления графика.
Вот сам график: Диаграмма Ганта
Основная цель этого - показать прогресс, достигнутый в течение дня, и иметь более или менее «живой» график. У меня уже есть развернутое приложение, которое берет файл PNG из определенной папки и отображает его в полноэкранном режиме и переключает «просмотры» между двумя URL-адресами (2 веб-страницы) и назначенной папкой PNG.
Вот часть моего кода, который генерирует диаграмму. Дайте мне знать, и я могу предоставить образцы данных вместе с ним для тестирования:
import pandas as pd
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import math
import time
import matplotlib.patches as mpatches
df = pd.read_csv('zpp00141_new.csv')
df1 = pd.read_csv('sample_data1.csv')
#convert times to number to calculate
def timestr_to_num(timestr):
return mdates.date2num(datetime.strptime('0' + timestr if timestr[1] == ':' else timestr, '%I:%M:%S %p'))
#gantt chart plotting
fig, ax = plt.subplots(figsize=(12.5, 6))
operations = pd.unique(df['Operation/Activity'])
#Declaring a colormap
cmap = plt.cm.get_cmap('plasma_r')
colors = [cmap(i/20) for i in range(20)]
#plot scheduled operations
for operation, color in zip(operations, colors):
for row in df[df['Operation/Activity'] == operation].itertuples():
left = timestr_to_num(row.start)
right = timestr_to_num(row.finish)
ax.barh(operation, left=left, width=right - left, height=1, color="#6ED06F", edgecolor = 'black', label = operation)
#plot "Actual" operations' times
operations1 = pd.unique(df1['Operation/Activity'])
for operation, color in zip(operations1, colors):
for row in df1[df1['Operation/Activity'] == operation].itertuples():
left = timestr_to_num(row.start)
right = timestr_to_num(row.finish)
ax.barh(operation, left=left, width=right - left, height=0.4, color='#33AFFF', edgecolor = 'black', label = operation)
#plt.legend()
#set x-axis limit
ax.set_xlim(timestr_to_num('06:00:00 AM'), timestr_to_num('4:30:00 PM'))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) # display ticks as hours and minutes
ax.xaxis.set_major_locator(mdates.HourLocator(interval=1)) # set a tick every hour
#set y and x labels
ax.set_xlabel('Time', fontsize = 'large')
ax.set_ylabel('Operation', fontsize = 'large')
plt.tight_layout()
ax.set_yticklabels(list(df['Operation/Activity'] + " - " + df['Operation short text'].astype(str)))
ax.tick_params(axis='both', which='major', labelsize=11)
#add a title to a plot
plt.title("Schedule", fontsize = 'x-large')
#convert "now" time to a certain format of hours:minutes:seconds am/pm and plot a vertical red line for the "Current time"
now = datetime.now()
now = now.strftime('%I:%M:%S %p')
plt.axvline(x=timestr_to_num(now),color='r', animated = True)
#adding the legend
patch = mpatches.Patch(color='#33AFFF', label='Actual')
patch2 = mpatches.Patch(color='#6ED06F', label='Planned')
plt.legend(handles=[patch, patch2], loc='upper left', fontsize = 'large')
#plt.legend(handles=[patch2], loc='upper left', fontsize = 'x-large')
plt.show()