Übersicht_Hydraulikkreise

Bibliotheken importieren

# Name des aktuellen Notebooks für die exportierten Datein
file_name = "Uebersicht_Lueftung_Sommer_Winter" 
# Ordner auf dem Server (nach files/)
ftp_folder = 'Notebooks/Auswertung'
## Bibliotheken, Module und Text- bzw- Grafikformatierungen aus zentraler Datei laden
%run ../Template/libraries_and_styles.ipynb 
## Warum auch immer muss rcParams.update() in eine eigene Zelle...
mpl.rcParams.update(params)

import mpld3
from mpld3 import plugins
from mpld3.utils import get_id 
import collections 

# https://stackoverflow.com/questions/50806166/pandas-dataframe-getting-average-value-for-each-monday-1-am
# https://stackoverflow.com/questions/52297501/how-to-plot-uncertainty-bounds-of-a-set-of-curves-where-each-curve-has-inconsist

# # %matplotlib notebook
# sys.path
# sys.path.insert(0,'c:\\users\\kolja\\appdata\local\\programs\\python\\python37\\lib\\site-packages\\plot')
# sys.path

Daten Import

daten = pd.read_csv('../1_Daten/Arbeitsdaten/Daten_15s.csv')
daten["Zeit"] = pd.to_datetime(daten["Zeit"],dayfirst=True)
daten.set_index(['Zeit'], inplace=True)

Plot Liniendiagramme - mittel, median, max, min

daten_tgl = daten 
daten_tgl['L_Zuluft_VPunkt'] = daten_tgl['L_Zuluft_1_VPunkt']  + daten_tgl['L_Zuluft_2_VPunkt'] + daten_tgl['L_Zuluft_3_VPunkt'] 


## tägliche Mittelwerte
daten_tgl = daten_tgl.loc['2017-05-01':'2018-04-30'].resample('1D').mean()
fig, ax = plt.subplots()
## Linien
daten_tgl['L_Zuluft_1_VPunkt'].plot(ax=ax,color=colo('rot',1), linewidth=0.5, label = 'Zuluft Sem1') 
daten_tgl['L_Zuluft_2_VPunkt'].plot(ax=ax,color=colo('grün',1), linewidth=0.5, label = 'Zuluft Sem2') 
daten_tgl['L_Zuluft_3_VPunkt'].plot(ax=ax,color=colo('blau',1), linewidth=0.5, label = 'Zuluft Flur') 
daten_tgl['L_Zuluft_VPunkt'].plot(ax=ax,color=colo('orange',1), linewidth=0.5, label = 'Zuluft gesamt') 
## Achsen & Legende
ax.set_ylabel(r'\textbf{Volumenstrom} (m\textsuperscript{3}/h)')    
ax.set(ylim=0) 
ax.set_xlabel('')
ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=4, loc=1)
set_legend_linewidth(legend)   
ax.set_title('tägliche Mittelwerte')
## X Achse mit Monaten und 2 mal dem Jahr :-)
monthlyX(ax)

# plt.savefig(output_folder + '/' + file_name + '_Volumenstroeme_tgl_mittel.pdf')
daten_tgl = daten 
daten_tgl['L_Zuluft_VPunkt'] = daten_tgl['L_Zuluft_1_VPunkt']  + daten_tgl['L_Zuluft_2_VPunkt'] + daten_tgl['L_Zuluft_3_VPunkt'] 

## tägliche Medianwerte
daten_tgl = daten_tgl.loc['2017-05-01':'2018-04-30'].resample('1D').median()
fig, ax = plt.subplots()
## Linien
daten_tgl['L_Zuluft_1_VPunkt'].plot(ax=ax,color=colo('rot',1), linewidth=0.5, label = 'Zuluft Sem1') 
daten_tgl['L_Zuluft_2_VPunkt'].plot(ax=ax,color=colo('grün',1), linewidth=0.5, label = 'Zuluft Sem2') 
daten_tgl['L_Zuluft_3_VPunkt'].plot(ax=ax,color=colo('blau',1), linewidth=0.5, label = 'Zuluft Flur') 
daten_tgl['L_Zuluft_VPunkt'].plot(ax=ax,color=colo('orange',1), linewidth=0.5, label = 'Zuluft gesamt') 
## Achsen & Legende
ax.set_ylabel(r'\textbf{Volumenstrom} (m\textsuperscript{3}/h)')    
ax.set(ylim=0) 
ax.set_xlabel('')
ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=4, loc=1)
set_legend_linewidth(legend)   
ax.set_title('tägliche Medianwerte')
## X Achse mit Monaten und 2 mal dem Jahr :-)

monthlyX(ax)
# plt.savefig(output_folder + '/' + file_name + '_Volumenstroeme_tgl_median.pdf')
daten_tgl = daten 
daten_tgl['L_Zuluft_VPunkt'] = daten_tgl['L_Zuluft_1_VPunkt']  + daten_tgl['L_Zuluft_2_VPunkt'] + daten_tgl['L_Zuluft_3_VPunkt'] 


## tägliche Maximalwerte
daten_tgl = daten_tgl.loc['2017-05-01':'2018-04-30'].resample('1D').max()
fig, ax = plt.subplots()
## Linien
daten_tgl['L_Zuluft_1_VPunkt'].plot(ax=ax,color=colo('rot',1), linewidth=0.5, label = 'Zuluft Sem1') 
daten_tgl['L_Zuluft_2_VPunkt'].plot(ax=ax,color=colo('grün',1), linewidth=0.5, label = 'Zuluft Sem2') 
daten_tgl['L_Zuluft_3_VPunkt'].plot(ax=ax,color=colo('blau',1), linewidth=0.5, label = 'Zuluft Flur') 
daten_tgl['L_Zuluft_VPunkt'].plot(ax=ax,color=colo('orange',1), linewidth=0.5, label = 'Zuluft gesamt') 
## Achsen & Legende
ax.set_ylabel(r'\textbf{Volumenstrom} (m\textsuperscript{3}/h)')    
ax.set(ylim=0) 
ax.set_xlabel('')
ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=4, loc=1)
set_legend_linewidth(legend)   
ax.set_title('tägliche Maximalwerte')
## X Achse mit Monaten und 2 mal dem Jahr :-)
monthlyX(ax)
# plt.savefig(output_folder + '/' + file_name + '_Volumenstroeme_tgl_max.pdf')

#plt.ioff()
# plt.ion() 
daten_tgl = daten 
daten_tgl['L_Zuluft_VPunkt'] = daten_tgl['L_Zuluft_1_VPunkt']  + daten_tgl['L_Zuluft_2_VPunkt'] + daten_tgl['L_Zuluft_3_VPunkt'] 


## tägliche Maximalwerte
daten_tgl = daten_tgl.loc['2017-05-01':'2018-04-30'].resample('1D').min()
fig, ax = plt.subplots()
## Linien
daten_tgl['L_Zuluft_1_VPunkt'].plot(ax=ax,color=colo('rot',1), linewidth=0.5, label = 'Zuluft Sem1') 
daten_tgl['L_Zuluft_2_VPunkt'].plot(ax=ax,color=colo('grün',1), linewidth=0.5, label = 'Zuluft Sem2') 
daten_tgl['L_Zuluft_3_VPunkt'].plot(ax=ax,color=colo('blau',1), linewidth=0.5, label = 'Zuluft Flur') 
daten_tgl['L_Zuluft_VPunkt'].plot(ax=ax,color=colo('orange',1), linewidth=0.5, label = 'Zuluft gesamt') 
## Achsen & Legende
ax.set_ylabel(r'\textbf{Volumenstrom} (m\textsuperscript{3}/h)')    
ax.set(ylim=0) 
ax.set_xlabel('')
ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
h0, l0 = ax.get_legend_handles_labels() 
legend = plt.legend(h0, l0, ncol=4, loc=1)
set_legend_linewidth(legend)   
ax.set_title('tägliche Minimalwerte')
## X Achse mit Monaten und 2 mal dem Jahr :-)
monthlyX(ax)
# plt.savefig(output_folder + '/' + file_name + '_Volumenstroeme_tgl_min.pdf')

Analyse - Jahr

sample = '15s' 
vol = daten['2017-05-01':'2018-04-30'].resample(sample).mean()
vol['L_Zuluft_VPunkt'] = vol['L_Zuluft_1_VPunkt']  + vol['L_Zuluft_2_VPunkt'] + vol['L_Zuluft_3_VPunkt'] 
vol.dropna(inplace= True)

Berechnungen

## Anzahl der bins festlegen
binsNR = [*range(1, 61, 1)] 
## bin_t = die Dauer, die jedes bin in Summe enthält
bin_t = pd.cut(vol['L_Zuluft_VPunkt'],60,labels=binsNR).value_counts().sort_index()
## intervall = das Intervall (von, bis] für jedes bin
values, interval = pd.cut(vol['L_Zuluft_VPunkt'],60,retbins=True)
## Mittelwerte des Intervalle berechnen 
interval_m = []
for i in range(0, 60):
    interval_m.append((interval[i] + interval[i+1])/2)
## df aus Dauer und Mittelwert
df = pd.DataFrame({'Dauer':(bin_t/240), 'V_Punkt':interval_m}) 

## Zeiten der drei Abschnitte berechnen
u = 0
for i in range(1, 13):
     u = u + bin_t[i]
m = 0
for i in range(13, 37):
    m = m + bin_t[i]
o = 0
for i in range(37, 61):
    o = o + bin_t[i]

Summe1 = bin_t.sum()/240
Summe2 = (u+m+o)/240
t_u = u/240
t_m = m/240
t_o = o/240

## mittlerer Volumenstrom eines jeden Abschnittes
## relativen Anteil berechnen
faktor = []
for i in range(1, 13):
    faktor.append(bin_t[i] / u)
for i in range(13, 37):
    faktor.append(bin_t[i] / m)
for i in range(37, 61):
    faktor.append(bin_t[i] / o)
df['faktor'] = faktor
## Volumenstrom * relativer Anteil
df['V_mittel'] = df.V_Punkt * faktor
## Abschnitte aufsummieren
V_m_u = df.loc[1:12]['V_mittel'].sum()
V_m_m = df.loc[13:36]['V_mittel'].sum()
V_m_o = df.loc[37:60]['V_mittel'].sum()

## Ausgabe
print(f'Kontrolle: {Summe1 - Summe2}') 
print(f'unten Dauer: {round(t_u,1)} h, durschn. Volumenstrom: {round(V_m_u,1)}m³') 
print(f'mitte Dauer: {round(t_m,1)} h, durschn. Volumenstrom: {round(V_m_m,1)}m³')
print(f'oben Dauer : {round(t_o,1)} h, durschn. Volumenstrom: {round(V_m_o,1)}m³') 

# display(df.head())
# display(df.tail())
# interval
Kontrolle: 0.0
unten Dauer: 3137.5 h, durschn. Volumenstrom: 169.6m³
mitte Dauer: 1950.8 h, durschn. Volumenstrom: 847.7m³
oben Dauer : 3613.4 h, durschn. Volumenstrom: 1483.0m³

Plot Histogramm - gesamt

## Histo
bins  = 60
oben  = 36
unten = 12
plt.figure(figsize=(2.78,2.05))
N, bins, patches = plt.hist(vol['L_Zuluft_VPunkt'], bins=bins, orientation="horizontal", label='Value')
plt.hist(vol['L_Zuluft_VPunkt'], bins=bins, orientation="horizontal", label='Value', edgecolor='black', linewidth=.4, histtype='step')
## die drei Bereiche einfärben, Füllung und Rahmen
for i in range(0,unten):
    patches[i].set_facecolor(colo('grün',.6))
    patches[i].set_edgecolor(colo('grün',.6))
for i in range(unten,oben):
    patches[i].set_facecolor(colo('grün',1))
    patches[i].set_edgecolor(colo('grün',1))    
for i in range(oben,60):
    patches[i].set_facecolor(colo('grün',1.6))
    patches[i].set_edgecolor(colo('grün',1.6))

## notwendig um die Achsen der Figur zu bekommen
ax = plt.gca()
## Label für Legende
top    = mpatches.Patch(facecolor =colo('grün',1.6),   edgecolor='black', label=r'$1.179 - 1.891$')
center = mpatches.Patch(facecolor =colo('grün',1), edgecolor='black', label='') #r'$\dot V \hspace{0.38cm}   500 - 1.000$')
bottom = mpatches.Patch(facecolor =colo('grün',.6),    edgecolor='black', label='') #r'$\dot V \hspace{0.74cm}   0 - \hspace{0.25cm} 500$')
## \hphantom{} funktioniert nicht in der Legende bzw. nicht vor dem ersten sichtbaren Zeichen, daher die Notlösung mit .text()
ax.text(.646, 458, r'$468 - 1.150$', transform=ax.get_yaxis_transform())
ax.text(.65,  265, r'$110 - \hphantom{1.}438$', transform=ax.get_yaxis_transform()) 
## Legende
legend = plt.legend(handles=[top,center,bottom],loc='lower right', bbox_to_anchor=(1., .06))  
set_legend_linewidth(legend)  
## Hintergrund der Legende transparent, damit der Text sichtbar wird ;-)
legend.get_frame().set_alpha(None)
legend.get_frame().set_facecolor((0, 0, 0, 0))

## Y Achse formatieren
ax.set(ylim=[0,1900]) 
## Ticks sind Mittelwerte des jeweiligen Abteils
ax.set_yticks([V_m_u, V_m_m,V_m_o]) 
# ax.set_ylabel(r'\textbf{Volumenstrom} ($m^3/h$)')   
ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
## X Achse skalieren mit dem Faktir 1/240, damit die 15s in Stunden abgebildet werden
ax.set_xlabel(r'\textbf{Zeit} (h)')   
ax.set(xlim=[0,500000]) 
ax.set_xticks([0,120000, 240000,360000,480000])  
x_vals = ax.get_xticks()
ax.set_xticklabels(['{:3.0f}%'.format(x / 240) for x in x_vals])
## remove minorticks
plt.tick_params(axis='x', which='minor', bottom=False)

## Stundenwerte
ax.text(.23,  265,  r'$3.140 h$', transform=ax.get_yaxis_transform()) 
ax.text(.23,  820,  r'$2.055 h$', transform=ax.get_yaxis_transform()) 
ax.text(.23,  1570, r'$3.505 h$', transform=ax.get_yaxis_transform()) 

plt.savefig(output_folder + '/' + file_name + '_Volumenstroeme_Histogramm_gesamt.pdf') 
plt.show()

Plot Histogramm - einzeln

daten_std = daten.resample('15s').mean()#.reset_index()
daten_std['L_Zuluft_VPunkt'] = daten_std['L_Zuluft_1_VPunkt']  + daten_std['L_Zuluft_2_VPunkt'] + daten_std['L_Zuluft_3_VPunkt'] 
daten_std['L_Zuluft_VPunkt'].isna().sum()  

bins = 40 
fig, ax = plt.subplots(nrows=3, ncols=1, sharex=True , constrained_layout=False,figsize=(3,2.05))
plt.subplots_adjust(hspace=.0)
# plt.hist(daten_std['L_Zuluft_VPunkt'],   bins=100, orientation="horizontal", color=colo('orange',1), linewidth=0.5, label = 'Zuluft gesamt')  
daten_std['L_Zuluft_1_VPunkt'].plot.hist(ax=ax[0], bins=bins, orientation="horizontal", color=colo('rot',1),    linewidth=0.4, edgecolor='black', label = 'Seminar 1',  histtype='stepfilled')  
daten_std['L_Zuluft_1_VPunkt'].plot.hist(ax=ax[0], bins=bins, orientation="horizontal", color=colo('black',1),  linewidth=0.3,                    label = '_nolegend_', histtype='step')  

daten_std['L_Zuluft_2_VPunkt'].plot.hist(ax=ax[1], bins=bins, orientation="horizontal", color=colo('orange',1), linewidth=0.4, edgecolor='black', label = 'Seminar 2',  histtype='stepfilled')  
daten_std['L_Zuluft_2_VPunkt'].plot.hist(ax=ax[1], bins=bins, orientation="horizontal", color=colo('black',1),  linewidth=0.4,                    label = '_nolegend_', histtype='step')  

daten_std['L_Zuluft_3_VPunkt'].plot.hist(ax=ax[2], bins=bins, orientation="horizontal", color=colo('blau',1),   linewidth=0.4, edgecolor='black', label = 'Flur',       histtype='stepfilled')  
daten_std['L_Zuluft_3_VPunkt'].plot.hist(ax=ax[2], bins=bins, orientation="horizontal", color=colo('black',1),  linewidth=0.4,                    label = '_nolegend_', histtype='step')  

# W_raus.plot.barh(position = 1.5, color = (Farben_raus), edgecolor='black',linewidth = 0.3, width = 0.5, ax = ax, stacked = True, alpha = 1,align='edge')


## Legende  
h0, l0 = ax[0].get_legend_handles_labels()
h2, l2 = ax[1].get_legend_handles_labels()  
h4, l4 = ax[2].get_legend_handles_labels()  
legend = plt.legend(h0+h2+h4, l0+l2+l4, loc='lower right', ncol=1, bbox_to_anchor=(1., .14))  
set_legend_linewidth(legend)  
# legend.get_frame().set_linewidth(0.3)

## Grenzen und Ticks
# ax[0].set(xlim=[0,2000]) 
# ax[1].set(xlim=[0,2000]) 
# ax[2].set(xlim=[0,2000]) 
ax[0].set(ylim=[0,1400]) 
ax[1].set(ylim=[0,180]) 
ax[2].set(ylim=[0,500]) 
ax[0].set_yticks([0,595]) 
ax[1].set_yticks([0,104]) 
ax[2].set_yticks([0,141])  
## Beschriftung Y Achse
ax[0].set_xlabel('')
ax[1].set_xlabel('')
ax[2].set_xlabel(r'\textbf{Zeit} (h)')   
## Tausendertrennzeichen
ax[0].get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[1].get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[2].get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[0].get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[1].get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[2].get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator

## X Achse skalieren mit dem Faktir 1/240, damit die 15s in Stunden abgebildet werden
ax[0].set_xticks([0,120000, 240000,360000,480000])  
x_vals = ax[0].get_xticks()
ax[0].set_xticklabels(['{:3.0f}%'.format(x / 240) for x in x_vals])
## remove minorticks
plt.tick_params(axis='x', which='minor', bottom=False)


## Beschriftungen Y Achse
ax[0].text(-0.28, -800, r'\textbf{Volumenstrom} ($m^3/h$)', va='center', rotation='vertical', transform=ax[0].get_yaxis_transform()) 

## Save
plt.savefig(output_folder + '/' + file_name + '_Volumenstroeme_Histogramm.pdf', bbox_inches='tight') 
print(f'Seminar 1: {round(daten_std.L_Zuluft_1_VPunkt.mean(),1)}')
print(f'Seminar 2: {round(daten_std.L_Zuluft_2_VPunkt.mean(),1)}')
print(f'Flur:      {round(daten_std.L_Zuluft_3_VPunkt.mean(),1)}') 
Seminar 1: 618.2
Seminar 2: 103.8
Flur:      142.6

Analyse - Sommer

sample = '15s' 
vol = daten['2017-07-01':'2017-08-30'].resample(sample).mean()
vol['L_Zuluft_VPunkt'] = vol['L_Zuluft_1_VPunkt']  + vol['L_Zuluft_2_VPunkt'] + vol['L_Zuluft_3_VPunkt'] 
vol.dropna(inplace= True)

Berechnungen

## Anzahl der bins festlegen
binsNR = [*range(1, 61, 1)] 
## bin_t = die Dauer, die jedes bin in Summe enthält
bin_t = pd.cut(vol['L_Zuluft_VPunkt'],60,labels=binsNR).value_counts().sort_index()
## intervall = das Intervall (von, bis] für jedes bin
values, interval = pd.cut(vol['L_Zuluft_VPunkt'],60,retbins=True)
## Mittelwerte des Intervalle berechnen 
interval_m = []
for i in range(0, 60):
    interval_m.append((interval[i] + interval[i+1])/2)
## df aus Dauer und Mittelwert
df = pd.DataFrame({'Dauer':(bin_t/240), 'V_Punkt':interval_m}) 

## Zeiten der drei Abschnitte berechnen
u = 0
for i in range(1, 13):
     u = u + bin_t[i]
m = 0
for i in range(13, 37):
    m = m + bin_t[i]
o = 0
for i in range(37, 61):
    o = o + bin_t[i]

Summe1 = bin_t.sum()/240
Summe2 = (u+m+o)/240
t_u = u/240
t_m = m/240
t_o = o/240

## mittlerer Volumenstrom eines jeden Abschnittes
## relativen Anteil berechnen
faktor = []
for i in range(1, 13):
    faktor.append(bin_t[i] / u)
for i in range(13, 37):
    faktor.append(bin_t[i] / m)
for i in range(37, 61):
    faktor.append(bin_t[i] / o)
df['faktor'] = faktor
## Volumenstrom * relativer Anteil
df['V_mittel'] = df.V_Punkt * faktor
## Abschnitte aufsummieren
V_m_u = df.loc[1:12]['V_mittel'].sum()
V_m_m = df.loc[13:36]['V_mittel'].sum()
V_m_o = df.loc[37:60]['V_mittel'].sum()

## Ausgabe
print(f'Kontrolle: {Summe1 - Summe2}') 
print(f'unten Dauer: {round(t_u,1)} h, durschn. Volumenstrom: {round(V_m_u,1)}m³') 
print(f'mitte Dauer: {round(t_m,1)} h, durschn. Volumenstrom: {round(V_m_m,1)}m³')
print(f'oben Dauer : {round(t_o,1)} h, durschn. Volumenstrom: {round(V_m_o,1)}m³') 

# display(df.head())
# display(df.tail())
# interval
Kontrolle: 0.0
unten Dauer: 1404.9 h, durschn. Volumenstrom: 156.0m³
mitte Dauer: 23.5 h, durschn. Volumenstrom: 929.4m³
oben Dauer : 25.2 h, durschn. Volumenstrom: 1391.2m³

Plot Histogramm - gesamt

## Histo
bins  = 60
oben  = 36
unten = 12
plt.figure(figsize=(2.78,2.05))
N, bins, patches = plt.hist(vol['L_Zuluft_VPunkt'], bins=bins, orientation="horizontal", label='Value')
plt.hist(vol['L_Zuluft_VPunkt'], bins=bins, orientation="horizontal", label='Value', edgecolor='black', linewidth=.4, histtype='step')
## die drei Bereiche einfärben, Füllung und Rahmen
for i in range(0,unten):
    patches[i].set_facecolor(colo('grün',.6))
    patches[i].set_edgecolor(colo('grün',.6))
for i in range(unten,oben):
    patches[i].set_facecolor(colo('grün',1))
    patches[i].set_edgecolor(colo('grün',1))    
for i in range(oben,60):
    patches[i].set_facecolor(colo('grün',1.6))
    patches[i].set_edgecolor(colo('grün',1.6))

## notwendig um die Achsen der Figur zu bekommen
ax = plt.gca()
## Label für Legende
top    = mpatches.Patch(facecolor =colo('grün',1.6),   edgecolor='black', label=r'$1.179 - 1.891$')
center = mpatches.Patch(facecolor =colo('grün',1), edgecolor='black', label='') #r'$\dot V \hspace{0.38cm}   500 - 1.000$')
bottom = mpatches.Patch(facecolor =colo('grün',.6),    edgecolor='black', label='') #r'$\dot V \hspace{0.74cm}   0 - \hspace{0.25cm} 500$')
## \hphantom{} funktioniert nicht in der Legende bzw. nicht vor dem ersten sichtbaren Zeichen, daher die Notlösung mit .text()
ax.text(.646, 458, r'$468 - 1.150$', transform=ax.get_yaxis_transform())
ax.text(.65,  265, r'$110 - \hphantom{1.}438$', transform=ax.get_yaxis_transform()) 
## Legende
legend = plt.legend(handles=[top,center,bottom],loc='lower right', bbox_to_anchor=(1., .06))  
set_legend_linewidth(legend)  
## Hintergrund der Legende transparent, damit der Text sichtbar wird ;-)
legend.get_frame().set_alpha(None)
legend.get_frame().set_facecolor((0, 0, 0, 0))

## Y Achse formatieren
# ax.set(ylim=[0,1900]) 
## Ticks sind Mittelwerte des jeweiligen Abteils
# ax.set_yticks([V_m_u, V_m_m,V_m_o]) 
# ax.set_ylabel(r'\textbf{Volumenstrom} ($m^3/h$)')   
ax.get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
## X Achse skalieren mit dem Faktor 1/240, damit die 15s in Stunden abgebildet werden
ax.set_xlabel(r'\textbf{Zeit} (h)')   
# ax.set(xlim=[0,500000]) 
# ax.set_xticks([0,120000, 240000,360000,480000])  
x_vals = ax.get_xticks()
ax.set_xticklabels(['{:3.0f}%'.format(x / 240) for x in x_vals])
## remove minorticks
plt.tick_params(axis='x', which='minor', bottom=False)

## Stundenwerte
ax.text(.23,  265,  r'$3.140 h$', transform=ax.get_yaxis_transform()) 
ax.text(.23,  820,  r'$2.055 h$', transform=ax.get_yaxis_transform()) 
ax.text(.23,  1570, r'$3.505 h$', transform=ax.get_yaxis_transform()) 

plt.savefig(output_folder + '/' + file_name + '_Volumenstroeme_Histogramm_gesamt.pdf') 
plt.show()

Plot Histogramm - einzeln

sample = '15s' 
daten_std = daten['2017-07-01':'2017-08-30'].resample(sample).mean() 
daten_std['L_Zuluft_VPunkt'] = daten_std['L_Zuluft_1_VPunkt']  + daten_std['L_Zuluft_2_VPunkt'] + daten_std['L_Zuluft_3_VPunkt'] 
daten_std['L_Zuluft_VPunkt'].isna().sum()  
vol.dropna(inplace= True)

bins = 40 
fig, ax = plt.subplots(nrows=3, ncols=1, sharex=True , constrained_layout=False,figsize=(3,2.05))
plt.subplots_adjust(hspace=.0)
# plt.hist(daten_std['L_Zuluft_VPunkt'],   bins=100, orientation="horizontal", color=colo('orange',1), linewidth=0.5, label = 'Zuluft gesamt')  
daten_std['L_Zuluft_1_VPunkt'].plot.hist(ax=ax[0], bins=bins, orientation="horizontal", color=colo('rot',1),    linewidth=0.4, edgecolor='black', label = 'Seminar 1',  histtype='stepfilled')  
daten_std['L_Zuluft_1_VPunkt'].plot.hist(ax=ax[0], bins=bins, orientation="horizontal", color=colo('black',1),  linewidth=0.3,                    label = '_nolegend_', histtype='step')  

daten_std['L_Zuluft_2_VPunkt'].plot.hist(ax=ax[1], bins=bins, orientation="horizontal", color=colo('orange',1), linewidth=0.4, edgecolor='black', label = 'Seminar 2',  histtype='stepfilled')  
daten_std['L_Zuluft_2_VPunkt'].plot.hist(ax=ax[1], bins=bins, orientation="horizontal", color=colo('black',1),  linewidth=0.4,                    label = '_nolegend_', histtype='step')  

daten_std['L_Zuluft_3_VPunkt'].plot.hist(ax=ax[2], bins=bins, orientation="horizontal", color=colo('blau',1),   linewidth=0.4, edgecolor='black', label = 'Flur',       histtype='stepfilled')  
daten_std['L_Zuluft_3_VPunkt'].plot.hist(ax=ax[2], bins=bins, orientation="horizontal", color=colo('black',1),  linewidth=0.4,                    label = '_nolegend_', histtype='step')  

# W_raus.plot.barh(position = 1.5, color = (Farben_raus), edgecolor='black',linewidth = 0.3, width = 0.5, ax = ax, stacked = True, alpha = 1,align='edge')


## Legende  
h0, l0 = ax[0].get_legend_handles_labels()
h2, l2 = ax[1].get_legend_handles_labels()  
h4, l4 = ax[2].get_legend_handles_labels()  
legend = plt.legend(h0+h2+h4, l0+l2+l4, loc='lower right', ncol=1, bbox_to_anchor=(1., .14))  
set_legend_linewidth(legend)  
# legend.get_frame().set_linewidth(0.3)

## Grenzen und Ticks
# ax[0].set(xlim=[0,2000]) 
# ax[1].set(xlim=[0,2000]) 
# ax[2].set(xlim=[0,2000]) 
# ax[0].set(ylim=[0,1400]) 
# ax[1].set(ylim=[0,180]) 
# ax[2].set(ylim=[0,500]) 
# ax[0].set_yticks([0,595]) 
# ax[1].set_yticks([0,104]) 
# ax[2].set_yticks([0,141])  
## Beschriftung Y Achse
ax[0].set_xlabel('')
ax[1].set_xlabel('')
ax[2].set_xlabel(r'\textbf{Zeit} (h)')   
## Tausendertrennzeichen
ax[0].get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[1].get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[2].get_yaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[0].get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[1].get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator
ax[2].get_xaxis().set_major_formatter(mpl.ticker.FuncFormatter(lambda x, loc: locale.format_string('%d', x, 1))) ## dot as thousand separator

## X Achse skalieren mit dem Faktir 1/240, damit die 15s in Stunden abgebildet werden
ax[0].set_xticks([0,120000, 240000,360000,480000])  
x_vals = ax[0].get_xticks()
ax[0].set_xticklabels(['{:3.0f}%'.format(x / 240) for x in x_vals])
## remove minorticks
plt.tick_params(axis='x', which='minor', bottom=False)


## Beschriftungen Y Achse
ax[0].text(-0.28, -800, r'\textbf{Volumenstrom} ($m^3/h$)', va='center', rotation='vertical', transform=ax[0].get_yaxis_transform()) 

## Save
plt.savefig(output_folder + '/' + file_name + '_Volumenstroeme_Histogramm.pdf', bbox_inches='tight') 
print(f'Seminar 1: {round(daten_std.L_Zuluft_1_VPunkt.mean(),1)}')
print(f'Seminar 2: {round(daten_std.L_Zuluft_2_VPunkt.mean(),1)}')
print(f'Flur:      {round(daten_std.L_Zuluft_3_VPunkt.mean(),1)}') 
Seminar 1: 65.2
Seminar 2: 62.5
Flur:      57.6

Save & Upload

## Skriptlaufzeit Ende (Funktion in: libraries_and_styles.ipynb)
hours, minutes, seconds = laufzeit()
## Notebook speichern vor dem Upload (Funktion in: libraries_and_styles.ipynb)
save_notebook() 
## Notebook als Markdown Datei mit eingebetten Grafiken speichern und auf den Server laden
%run ../Template/save_and_upload.ipynb  
 Analyse_RLT MCA_Speicherverluste