Witam, potrzebuję pomocy przy generowaniu wykresu Gantta. Chciałbym, aby po kliknięciu na dany słupek, pojawiło się nowy wykres tylko z tego krótkiego wycinku. Jak dodać element onclick, żeby to zadziałało?
Kod programu a niżej obrazek obecnego stanu
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
import matplotlib.patches as mpatches
import mplcursors as mpc
import matplotlib.dates as md
from datetime import datetime
df = pd.DataFrame([
dict(Data="2023-03-10", Start='9:10:00', Koniec='9:20:00', Task="Jazda", kolor="#fc2d2d"),
dict(Data="2023-03-10", Start='9:20:00', Koniec='10:15:00', Task="Odpoczynek", kolor="#63ed40"),
dict(Data="2023-03-10", Start='10:15:00', Koniec='17:00:00', Task="Jazda", kolor="#fc2d2d"),
#te dwa poniżej, są traktowane jako jedno, tylko żeby było to ładnie widać na wykresie,
# s trzeba to rozdzielić na dwa, jedno do a drugie od północy
dict(Data="2023-03-10", Start='17:00:00', Koniec='23:59:59', Task="Odpoczynek", kolor="#63ed40"),
dict(Data="2023-03-11", Start='00:00:00', Koniec='6:30:00', Task="Odpoczynek", kolor="#63ed40"),
dict(Data="2023-03-11", Start='6:30:00', Koniec='8:30:00', Task="Dyspozycyjnosc", kolor="#2debfc"),
dict(Data="2023-03-11", Start='8:30:00', Koniec='19:30:00', Task="Prace inne", kolor="#f9fc2d"),
dict(Data="2023-03-11", Start='19:30:00', Koniec='23:58:59', Task="Odpoczynek", kolor="#63ed40"),
dict(Data="2023-03-12", Start='00:00:00', Koniec='4:30:00', Task="Jazda", kolor="#fc2d2d"),
dict(Data="2023-03-12", Start='04:30:00', Koniec='5:00:00', Task="Odpoczynek", kolor="#63ed40"),
dict(Data="2023-03-12", Start='05:00:00', Koniec='8:30:00', Task="Jazda", kolor="#fc2d2d"),
dict(Data="2023-03-12", Start='08:30:00', Koniec='15:20:00', Task="Odpoczynek", kolor="#63ed40")
])
df['Start'] = pd.to_datetime(df['Start'])
df['Koniec'] = pd.to_datetime(df['Koniec'])
fig, ax = plt.subplots()
ax.barh(df['Data'], df['Koniec'] - df['Start'], left=df['Start'], height=0.4, align='center', alpha=0.8, linewidth=1, edgecolor='black', color=df['kolor'], label=df['Task'])
jazda = mpatches.Patch(color='#fc2d2d', label='Jazda')
odpoczynek = mpatches.Patch(color='#63ed40', label='Odpoczynek')
dyspozycja = mpatches.Patch(color='#2debfc', label='Dyspozycyjność')
praceinne = mpatches.Patch(color='#f9fc2d', label='Prace inne')
plt.legend(handles=[jazda, odpoczynek,dyspozycja,praceinne])
ax.set_yticks(df['Data'])
ax.set_yticklabels(df['Data'])
ax.set_xlim(pd.to_datetime("00:00:00"), pd.to_datetime("23:59:59"))
xloc=md.HourLocator(interval = 1)
ax.xaxis.set_major_locator(xloc)
ax.xaxis.set_major_formatter(DateFormatter('%H:%M'))
ax.invert_yaxis()
ax.grid(axis='x')
fig.autofmt_xdate()
plt.xticks(rotation = 0,ha='center')
start1 = df['Start']
koniec1 = df['Koniec']
roznica=(df['Koniec']-df['Start'])
crs = mpc.cursor(hover=True)
crs.connect("add", lambda sel: sel.annotation.set_text(
'Tryb: {}\nStart: {}\nKoniec: {}\n Czas trwania: {}'.format(df['Task'][sel.index],start1[sel.index].strftime("%H:%M:%S"), koniec1[sel.index].strftime("%H:%M:%S"), roznica[sel.index])))
plt.show()
Po najechaniu na zielony pasek pokazuje się adnotacja. Jak zrobić, by po kliknięciu na pasek pojawiło się nowe okienko lub nowy wykres?
