kleine Mathe-Spielereien

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

11.8.2025
Endlich habe ich ein perfektes Programm gefunden,
in dem das CSV-Problem demonstriert wird.
Ich werde versuchen ein analoges Programm mit anderen Daten
zu entwickeln. Einen Versuch ist es jedenfalls wert.##
(wer immer stetig sich bemüht, den können wir erlösen: frei nach Goethe FaustII)
OSWALD

Code: Alles auswählen


import requests
import matplotlib.pyplot as plt
import pandas as pd
import io

CSV_URL = 'https://www.kiel.de/opendata/kiel_gesetze_justiz_strassenverkehsunfaelle_verkehrstote_verletzte_fahrerflucht.csv'
#Anschließend kommt requests zum Einsatz, wobei die Daten der Variablen csv_data zugewiesen werden:

csv_data = requests.get(CSV_URL).content
#Jetzt kann ein Dataframe erzeugt werden,
#d.h. wir verwenden das Modul Pandas um die Daten zu parsen.

#Falls Euch der Begriff Dataframe noch nicht begegnet ist: Die Pandas-Bibliothek enthält einige nützliche Datenstrukturen, u.a. das Dataframe-Objekt.
#Dabei handelt es sich um eine Zwei-Dimensionale Tabelle mit Zeilen und Spalten (so wie man es beispielsweise aus einer Tabellenkalkulation wie Excel oder Numbers kennt).

df = pd.read_csv(io.StringIO(csv_data.decode('utf-8')), sep=';')
#Die ersten fünf Zeilen lassen sich übrigens wie folgt ausgeben:

print(df.head())
print(df)
#Daten visualisieren
#Dies war der interessante Teil.
##Anstatt eine lokale CSV-Datei zu verwenden, wurde das Modul requests genutzt,
#um die Daten aus dem Internet zu laden.
#Als Zeichencodierung habe ich „utf-8“ angegeben und zusätzlich
#ein Semikolon als Trennzeichen definiert.
#Der restliche Code entspricht meinem alten Beispiel:

fig, ax = plt.subplots()

x = df['Jahr']
y = df['Unfaelle']
print('Aufzaehlung der Unfaelle',x, y)

plt.title('Straßenverkehrsunfälle in Kiel', size='x-large')
plt.ylabel('Anzahl', size='x-large')
plt.xlabel('Jahr', size='x-large')
 
plt.plot(y, '*-', markersize=6, linewidth=1, color='b', label='Unfälle')
print(plt.plot(y, '*-', markersize=6))
plt.legend(loc=(0.4, 0.8))

ax.set_xticks(range(len(x)))
ax.set_xticklabels(x, rotation='vertical')

plt.show()





Benutzeravatar
__blackjack__
User
Beiträge: 14093
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`requests` und `io` hier selbst zu benutzen ist nicht notwendig — man kann Pandas auch eine URL statt eines Dateinamens übergeben.

Das Label "Jahr" ist bei mir nicht sichtbar. `tight_layout()` schafft da Platz für.

Wenn man mit Statistik nicht lügen oder irreführen möchte, sollte bei solchen Plots die Bandbreite bis runter zu 0 gehen, sonst sehen Unterschiede/Änderungen in der Regel überproportional gross aus.

Code: Alles auswählen

#!/usr/bin/env python3
import matplotlib.pyplot as plt
import pandas as pd


CSV_URL = "https://www.kiel.de/opendata/kiel_gesetze_justiz_strassenverkehsunfaelle_verkehrstote_verletzte_fahrerflucht.csv"


def main():
    df = pd.read_csv(CSV_URL, sep=";", encoding="utf-8")
    _fig, ax = plt.subplots()

    plt.title("Straßenverkehrsunfälle in Kiel", size="x-large")
    plt.ylabel("Anzahl", size="x-large")
    plt.xlabel("Jahr", size="x-large")
    plt.plot(
        df["Unfaelle"],
        "*-",
        markersize=6,
        linewidth=1,
        color="blue",
        label="Unfälle",
    )
    # plt.legend(loc="upper center")

    x = df["Jahr"]
    ax.set_xticks(range(len(x)))
    ax.set_xticklabels(x, rotation="vertical")
    ax.set_ylim(0)

    plt.tight_layout()
    plt.show()


if __name__ == "__main__":
    main()
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

29.8.20255
Aus gegebenem Anlass musste ich mich mit PDF beschäftigen.
- Aus e-Mail PDF-Anhang auf PC sichern
- mit Chrome lesen
- das klappte perfekt
Nun aber wollte ich wissen , wie man mit Python -Text auf PDF transponieren - kann.
Nach Versuchen mit den zahlrechen Modulen/Paketen, die ich nicht
bewältigen konnte, habe es dann doch
mit ReportLab zu einem ersten Programm gebracht.


PDF wird verwendet, weil es eine plattformunabhängige,
originalgetreue Darstellung eines Dokuments gewährleistet,
unabhängig vom verwendeten Gerät oder Betriebssystem.
Es bietet Vorteile wie Datensicherheit, Kompatibilität
mit verschiedenen Inhaltstypen (Text, Bilder, Audio, 3D-Modelle)
und Benutzerfreundlichkeit beim Anzeigen, aber davon bin ich noch Lichtjahre entfernt.
Erklärungen folgen noc
OSWALD

Code: Alles auswählen

  
#  Transformation von     Text   zu  PDF 
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch ,cm

def create_simple_pdf(filename="Taucher_example.pdf"):
    doc = SimpleDocTemplate(filename)
   
    
    styles = getSampleStyleSheet()
    story = []

    # Ein einfacher Absatz
    #text = "Dies ist ein einfacher Text in einer PDF-Datei, die mit ReportLab erstellt wurde."
    text =  '''Wer wagt es, Rittersmann oder Knapp,
    'Zu tauchen in diesen Schlund?
    Einen goldnen Becher werf ich hinab,
    Verschlungen schon hat ihn der schwarze Mund.
    Wer mir den Becher kann wieder zeigen,
    Er mag ihn behalten, er ist sein eigen 

    Der König spricht es, und wirft von der Höh
    Der Klippe, die schroff und steil
    Hinaushängt in die unendliche See,
    Den Becher in der Charybde Geheul.
    „Wer ist der Beherzte, ich frage wieder,
     Zu tauchen in diese Tiefe nieder? '''

                                           
   
    paragraph = Paragraph(text, styles['Normal'])
    story.append(paragraph)
    #print(story)
    # Ein weiterer Absatz mit mehr Text
    text2 = "ReportLab ist eine leistungsstarke Bibliothek,\
    die das Erstellen von PDF-Dokumenten in Python ermöglicht."
    paragraph2 = Paragraph(text2, styles['Normal'])
    story.append(paragraph2)
    #print(story)
    # Den Inhalt des Dokuments generieren
    doc.build(story)
    print(f"'{filename}' wurde erfolgreich erstellt.")


# Die Funktion aufrufen, um die PDF zu erstellen
create_simple_pdf()
                                
 
OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

29.8.2025
Darstellung der PDF - Datei
Ordner erstellen:
nach Ablauf des Code
zurück zum Ordner
auf Python-file alle Dateien einstellen
aus angezeigten PDF-Dateien
z.B. ' öffnen mit Chrome auswählen
PDF Datei erscheint (allerdings noch mit anonym)
hier noch ein Beispiel mit größerem Text
Ich hoffe, dass bis jetzt alles richtig ist
OSWALD

Code: Alles auswählen



#  Transformation von     Text   zu  PDF 
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch ,cm

def create_simple_pdf(filename="Schatzgräber_example.pdf"):
    doc = SimpleDocTemplate(filename)
    #print(doc)
    
    styles = getSampleStyleSheet()
    story = []

    # Ein einfacher Absatz
    text = '''Der Schatzgräber
Arm am Beutel, krank am Herzen,
Schleppt ich meine langen Tage.
Armuth ist die größte Plage,
Reichthum ist das höchste Gut!
Und zu enden meine Schmerzen,
Ging ich einen Schatz zu graben.
Meine Seele sollst du haben!
Schrieb ich hin mit eignem Blut.

Und so zog ich Kreis um Kreise,
Stellte wunderbare Flammen,
Kraut und Knochenwerk zusammen:
Die Beschwörung war vollbracht.
Und auf die gelernte Weise
Grub ich nach dem alten Schatze
Auf dem angezeigten Platze;
Schwarz und stürmisch war die Nacht.


Und ich sah ein Licht von weiten,
Und es kam gleich einem Sterne,
Hinten aus der fernsten Ferne.
Eben als es zwölfe schlug.
Und da galt kein Vorbereiten:
Heller ward's mit einemmale
Von dem Glanz der vollen Schale,
Die ein schöner Knabe trug.

Holde Augen sah ich blinken
Unter dichtem Blumenkranze;
In des Trankes Himmelsglanze
Trat er in den Kreis herein.
Und er hieß mich freundlich trinken,
Und ich dacht' es kann der Knabe
Mit der schönen, lichten Gabe
Wahrlich nicht der Böse sein.

Trinke Muth des reinen Lebens!
Dann verstehst du die Belehrung,
Kommst, mit ängstlicher Beschwörung,
Nicht zurück an diesen Ort.
Grabe hier nicht mehr vergebens!
Tages Arbeit, Abends Gäste!
Saure Wochen, frohe Feste!
Sei dein künftig Zauberwort. '''

 
   
    paragraph = Paragraph(text, styles['Normal'])
    story.append(paragraph)
    #print(story)
    # Ein weiterer Absatz mit mehr Text
    text2 = "ReportLab ist eine leistungsstarke Bibliothek,\
    die das Erstellen von PDF-Dokumenten in Python ermöglicht."
    paragraph2 = Paragraph(text2, styles['Normal'])
    story.append(paragraph2)
    #print(story)
    # Den Inhalt des Dokuments generieren
    doc.build(story)
    print(f"'{filename}' wurde erfolgreich erstellt.")


# Die Funktion aufrufen, um die PDF zu erstellen
create_simple_pdf()


OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

2.8.2025
Für Fachleute noch ein Blick in das Innenleben
des letzten Programms
Ich habe nicht die geringste Ahnung
Gute Zeit OSWALD

Code: Alles auswählen

PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/Contents 7 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 6 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<

>> 
  /Type /Page
>>
endobj
4 0 obj
<<
/PageMode /UseNone /Pages 6 0 R /Type /Catalog
>>
endobj
5 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20250829152319+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250829152319+02'00') /Producer (ReportLab PDF Library - www.reportlab.com) 
  /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>>
endobj
6 0 obj
<<
/Count 1 /Kids [ 3 0 R ] /Type /Pages
>>
endobj
7 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 306
>>
stream
GasJK:K)m"&B4*cMKc.^;M&$7[6o<+TfP2[8RVu=#b!=Dq=Y#k3]bPG43;#WZYt=h+S$\Q]BFd)`,[4J@`T3N&gi]eCh<)UM"AqL6[C9"/6cb9_De3g@B72iMD$tCd*5J9,ScA,Md2HuFpuf24==.YA0L2s0iraGaEQ7H@a\=+25/KXH[=s/n'r"\*E1]J?3a\4GQIUGGr[)*q=odaVuL4`jA4(iI:lYK9E$r=auNM2+`-eUeNMO6ba>5IfZnGHnC!fZ8)F^q)>5BFn*nVFDa'R*A@mVdeZ*A,;=e]V#X/5()fZG~>endstream
endobj
xref
0 8
0000000000 65535 f 
0000000073 00000 n 
0000000104 00000 n 
0000000211 00000 n 
0000000414 00000 n 
0000000482 00000 n 
0000000765 00000 n 
0000000824 00000 n 
trailer
<<
/ID 
[<59b0fed9a9c45d3646493e0aeb7d8abb><59b0fed9a9c45d3646493e0aeb7d8abb>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)

/Info 5 0 R
/Root 4 0 R
/Size 8
>>
startxref
1220
%%EOF


OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

30.8.2025
Hier ein Python Beispiel mit PGF-Grafik. Auch einfach.
Inzwischen habe ich gelesen, dass eine Transformation
von PDF zu Texten etc. in Python nicht möglich ist.
Dafür benötigt man andere Methoden.
Ich werde nun versuchen weitere PDF-Dateien ,etwa
mit besonderen Gliederungen der Texte herzustellen-
OSWALD

Code: Alles auswählen

import matplotlib.pyplot as plt
import numpy as np

# Daten erstellen
x = np.linspace(0, 10, 100)
y = np.sin(x)

# Plot erstellen
plt.plot(x, y)
plt.title("Beispiel-Sinus-Diagramm")
plt.xlabel("X-Achse")
plt.ylabel("Y-Achse")

# Diagramm als PDF speichern
plt.savefig("mein_diagramm.pdf")
plt.show()

OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

30.8.2025
Nun meines Bild als PDF.
schon wesentlich schwieriger ,weil
stets der richtige Pfad gefunden werden muss
und die Zeilen des Code werden immer länger.

Code: Alles auswählen

rom PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

def bilder_zu_pdf(bildpfade, ausgabe_pdf):
    """
    Integriert eine Liste von Bildern in eine PDF-Datei.

    Args:
        bildpfade (list): Eine Liste von Pfaden zu den Bilddateien.
        ausgabe_pdf (str): Der Name der Ausgabedatei (z.B. 'meine_bilder.pdf').
    """
    c = canvas.Canvas(ausgabe_pdf, pagesize=letter)
    for bildpfad in bildpfade:
        try:
            img = Image.open(bildpfad)
            # Größe des Bildes an die Seitengröße anpassen (optional)
            # Sie können hier auch andere Abmessungen festlegen
            c.setPageSize((img.width, img.height))
            c.drawImage(bildpfad, 0, 0, width=img.width, height=img.height)
            c.showPage() # Neue Seite für das nächste Bild
        except FileNotFoundError:
            print(f"Fehler: Bilddatei '{bildpfad}' nicht gefunden.")
        except Exception as e:
            print(f"Fehler beim Verarbeiten von '{bildpfad}': {e}")

    c.save() # PDF speichern

# Beispiel: Ihre Bilder und die Ausgabedatei
meine_bilder = ["C:/Users/Oswald Ruckriegel/Pictures/Screenshot.png          "]
# Ersetzen Sie diese durch Ihre tatsächlichen Dateipfade
pdf_dateiname = "mein erstes Bild.pdf"

# Funktion aufrufen, um die PDF zu erstellen
bilder_zu_pdf(meine_bilder, pdf_dateiname)
print(f"PDF '{pdf_dateiname}' wurde erfolgreich erstellt.")

OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

31.8.2025
Ich habe inzwischen verstanden, dass ich mich hier
immer nur mit Python beschäftige und nur indirekt
mit PDF , quasi als Ergebnis.

Die ersten Programme waren praktisch
ohne jegliche Attribute, wie etwa "der Titel' ,also anonym.
Bei dem folgenden Code wird eine Tabelle dargestellt.
Und schon sind zahlreiche neue Bibliotheken notwendig,
die wiederum zahllose Attribute etc liefern.
Alles weitere sind kommerzielle Projekte, .zT open source.
Ich kann mich nur mit Python beschäftigen.
jedenfalls weiß ich jetzt, was PDF bedeutet und wie man
PDF als "Universal.Datei " einsetzen kann.
OSWALD

Code: Alles auswählen


import itertools
from random import randint
from statistics import mean

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas


def grouper(iterable, n):
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args)


def export_to_pdf(data):
    c = canvas.Canvas("grid-students.pdf", pagesize=A4)
     
    w, h = A4
    max_rows_per_page = 45
    # Margin.
    x_offset = 50
    y_offset = 50
    # Space between rows.
    padding = 15

    xlist = [x + x_offset for x in [0, 200, 250, 300, 350, 400, 480]]
    ylist = [h - y_offset - i*padding for i in range(max_rows_per_page + 1)]

    for rows in grouper(data, max_rows_per_page):
        rows = tuple(filter(bool, rows))
        c.grid(xlist, ylist[:len(rows) + 1])
        for y, row in zip(ylist[:-1], rows):
            for x, cell in zip(xlist, row):
                c.drawString(x + 2, y - padding + 3, str(cell))
        c.showPage()

    c.save()


data = [("NAME", "GR. 1", "GR. 2", "GR. 3", "AVG", "STATUS")]

for i in range(1, 101):
    exams = [randint(0, 10) for _ in range(3)]
    avg = round(mean(exams), 2)
    state = "Approved" if avg >= 4 else "Disapproved"
    data.append((f"Student {i}", *exams, avg, state))

export_to_pdf(data)





OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

31.8.2025
Immer häufiger tritt im Zusammenhang mit PDF der Begriff "Canvas" auf, mit dem man sich
intensiv beschäftigen sollte.

Code: Alles auswählen

[

import tkinter as tk

root = tk.Tk()
root.geometry('800x600')
root.title('Was man hier sieht  ist  ein Canvas Demo')

canvas = tk.Canvas(root, width=600, height=400, bg='orange')
canvas.pack(anchor=tk.CENTER, expand=True)

root.mainloop()






/code]
Benutzeravatar
__blackjack__
User
Beiträge: 14093
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OSWALD: `grouper()` ist hier ungünstig weil das die letzte Gruppe mit Werten auffüllt, die dann wieder entfernt werden müssen. `more_itertools.chunked()` macht das nicht. Das liefert in der letzten Gruppe einfach den Rest, ohne die aufzufüllen.

Mit `Canvas` von Tk muss man sich überhaupt nicht beschäftigen wenn es um PDF geht.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6875
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ab Python 3.12 kann man dafür auch itertools.batched benutzen.
OSWALD
User
Beiträge: 609
Registriert: Freitag 18. März 2022, 17:32

1.9.2025
Zum Abschluss des Kapitels PFD noch
3 kleine Graphik-Programme.
Man sieht: Python kann alles und hat die Zukunft für sich.
OSWALD

Code: Alles auswählen


#Einfache Liniengrafik
from reportlab.graphics.shapes import Drawing, Line
from reportlab.graphics import renderPDF

#  Einfache Liniengrafik
drawing = Drawing(400, 200)
line = Line(50, 50, 350, 150)  # Linie von Punkt (50, 50) nach (350, 150)
drawing.add(line)

# PDF speichern
with open("line_chart.pdf", "wb") as pdf_file:
    renderPDF.drawToFile(drawing, pdf_file)

#############################################################
#            2. Balkendiagramm

 
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.graphics.shapes import Drawing
from reportlab.graphics import renderPDF

# Daten für das Diagramm
data = [[10, 20, 30, 40], [15, 25, 35, 45]]

# Diagramm erstellen
drawing = Drawing(400, 200)
bar_chart = VerticalBarChart()
bar_chart.x = 50
bar_chart.y = 50
bar_chart.height = 125
bar_chart.width = 300
bar_chart.data = data
bar_chart.categoryAxis.categoryNames = ['Q1', 'Q2', 'Q3', 'Q4']
drawing.add(bar_chart)
# PDF speichern
with open("bar_chart.pdf", "wb") as pdf_file:
    renderPDF.drawToFile(drawing, pdf_file)
    print(pdf_file)

##########################################################
#3. Kreisdiagramm (Pie Chart)

 
from reportlab.graphics.charts.piecharts import Pie
from reportlab.graphics.shapes import Drawing
from reportlab.graphics import renderPDF

# Daten für das Kreisdiagramm
data = [30, 20, 50]

# Diagramm erstellen
drawing = Drawing(400, 200)
pie_chart = Pie()
pie_chart.x = 150
pie_chart.y = 50
pie_chart.data = data
pie_chart.labels = ['A', 'B', 'C']
drawing.add(pie_chart)

# PDF speichern
with open("pie_chart.pdf", "wb") as pdf_file:
    renderPDF.drawToFile(drawing, pdf_file)





Antworten