# Python 3.9.2
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import FormatStrFormatter
from est_tarife import ESt
from est_freibetraege import KFB
from kindergeld import kindergeld_pro_jahr as Kg
import locale
# Umstellung auf Deutsch:
locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
# generelle Schrift
font = {'family': 'sans serif',
'weight': 'normal',
'style': 'normal',
'size': '12'}
mpl.rc('font', **font)
# x/y-Achsen
mpl.rc('xtick', labelsize=14)
mpl.rc('ytick', labelsize=14)
#Steuerersparnis durch Kinderfreibetrag
def EStDiff(zve, vh, n, jahr):
kfb = n * KFB[jahr]
ESt0 = ESt(zve, vh, jahr)
EStK = ESt(zve - kfb, vh, jahr)
return ESt0 - EStK
def Huellkurve(zve, vh, n, jahr):
ediff = EStDiff(zve, vh, n, jahr)
kgeld = Kg(n, jahr)
if ediff > kgeld:
return ediff
else:
return kgeld
def Grenzwert(zve, vh, n, jahr):
while Kg(n, jahr) >= EStDiff(zve, vh, n, jahr):
zve += 1
print("Grenzwert", jahr, "n =", n, zve)
return zve
def plot_kurven(ax, x, vh):
for n in [3,2,1]:
ax.plot(x, [EStDiff(zve, vh, n, jahr) for zve in x], '--', label='', c=farbe[n-1], lw=1.0)
ax.plot(x, [Kg(n, jahr) for zve in x], '--', label='', c=farbe[n-1], lw=1.0)
ax.plot(x, [Huellkurve(zve, vh, n, jahr) for zve in x], '-', label=KinderText[n-1], c=farbe[n-1], lw=2.5)
def set_pfeile(ax, zve_anf, vh, jahr):
#Pfeile
spw = 300
sph = 150
for n in [1,2,3]:
y0 = Kg(n, jahr)
x0 = Grenzwert(zve_anf, vh, n, jahr)
ax.arrow(x0,y0,0,-y0+sph, head_width=spw, head_length=sph, fc=farbe[n-1], ec=farbe[n-1], lw=0.25)
#Arrays für Plot-Schleife
KinderText = ['1 Kind', '2 Kinder', '3 Kinder']
farbe = ['red', 'blue', 'green']
def plot_kindergeld_freibetrag(jahr):
samples = 1000
xmin = 0; xmax = 160000
y1min = 0; y1max = 12000
y2min = 0; y2max = 12000
x = np.arange(xmin, xmax, xmax/samples)
fig = plt.figure(figsize=(14.0, 14.0), dpi=75)
fig.suptitle(f'Kindergeld im Vergleich zur\nSteuerersparnis durch Kinderfreibeträge {jahr}', fontsize=24, fontweight='bold')
ax1 = fig.add_subplot(211) #ZeilenSpaltenPos
ax1.set_title('Splittingtarif', horizontalalignment='center', x=(5.0/15), y=0.9, fontsize=18, fontweight='bold')
ax0 = fig.add_subplot(212) #ZeilenSpaltenPos
ax0.set_title('Grundtarif', horizontalalignment='center', x=(3.0/15), y=0.9, fontsize=18, fontweight='bold')
print("plotting 1... Ehepaar")
plot_kurven(ax1, x, 1)
ax1.legend(loc='lower right', fontsize=14)
print("plotting 2... Alleinerziehend")
plot_kurven(ax0, x, 0)
ax0.legend(loc='lower right', fontsize=14)
ax0.set_xlabel('Jährlich zu versteuerndes Einkommen (Euro)', fontsize=18, fontweight='bold', labelpad=10)
set_texte(ax1, 159000, 1, jahr)
set_texte(ax0, 100000, 0, jahr)
set_pfeile(ax1, 69000, 1, jahr)
set_pfeile(ax0, 36000, 0, jahr)
basis_settings(ax1, xmin,xmax, y1min,y1max)
basis_settings(ax0, xmin,xmax, y2min,y2max)
ax0.text(-9000,-1300, f'CC BY-SA 4.0, Udo Brechtel, {jahr}', fontsize=8, fontweight='normal', color='black')
plt.tight_layout()
plt.subplots_adjust(top=0.9)
plt.savefig(f"bilder/Kindergeld im Vergleich zur Steuerersparnis durch Kinderfreibeträge {jahr}.svg")
def set_texte(ax, zve, vh, jahr):
dx1, dy1 = 1300, 300
for n in [1,2,3]:
kgeld = Kg(n, jahr)
maxDiff = EStDiff(zve, vh, n, jahr)
maxDiffText = "Steuerersparnis\n = {0:5.0f} €".format(maxDiff)
kGeldText = "Kindergeld\n = {0:6.0f} €".format(kgeld)
ax.text(zve, maxDiff+dy1, maxDiffText, color='black', horizontalalignment='right', fontsize=14, style='italic',
bbox=dict(facecolor='white', alpha=1.0, edgecolor=farbe[n-1], boxstyle='round,pad=0.3'))
ax.text(dx1, kgeld+dy1, kGeldText, color='black', horizontalalignment='left', fontsize=14, style='italic',
bbox=dict(facecolor='white', alpha=1.0, edgecolor=farbe[n-1], boxstyle='round,pad=0.3'))
print(zve, vh, n, jahr, kGeldText, maxDiffText)
def basis_settings(ax, x0,x1, y0,y1):
ax.yaxis.set_tick_params(which='both', direction='out', pad=5) #, width=2, colors='black')
ax.xaxis.set_tick_params(which='both', direction='out', pad=5)
Euroformat = FormatStrFormatter('%g €')
ax.xaxis.set_major_formatter(Euroformat)
ax.yaxis.set_major_formatter(Euroformat)
ax.grid(b=True, which='major', color='gray', lw=0.4, linestyle='-', alpha=0.6)
ax.grid(b=True, which='minor', color='gray', lw=0.2, linestyle='-', alpha=0.5)
ax.minorticks_on()
ax.yaxis.tick_left()
ax.xaxis.tick_bottom()
ax.grid(b=True, which='major', color='gray', lw=0.4, linestyle='-', alpha=0.6)
ax.grid(b=True, which='minor', color='gray', lw=0.2, linestyle='-', alpha=0.5)
ax.set_xlim(x0,x1)
ax.set_ylim(y0,y1)
# RUN:
jahr = 2023
plot_kindergeld_freibetrag(jahr)