Zum Hauptinhalt springen
Lektion 7 von 12 · Bildanalyse und visuelle Erkennung über die API

Diagramme mit der Vision API analysieren

Lektion 7 von 12 Aktualisiert am 2. November 2026 Entwickler
Auf dieser Seite
  1. Diagramme wie ein Analyst lesen
  2. Prinzipien der Diagrammanalyse
  3. Analyse eines Balkendiagramms
  4. Extraktion numerischer Daten
  5. Analyse eines Liniendiagramms (Trends)
  6. Analyse eines Kreisdiagramms (Verteilung)
  7. Analyse-Pipeline für Berichte
  8. Grenzen der Diagrammanalyse
  9. Kernaussagen

Diagramme wie ein Analyst lesen

Diagramme – Balken-, Liniendiagramme, Kreis- und Flächendiagramme – sind in Geschäftsberichten, Dashboards und wissenschaftlichen Publikationen allgegenwärtig. Sie stellen ein spezifisches Problem dar: Die Informationen sind in einem Bild festgehalten, oft ohne die Quelldaten beizufügen. Ein jährlicher PDF-Bericht könnte beispielsweise dreißig Kurven enthalten, und die ursprüngliche Excel-Datei ist nicht mehr vorhanden.

Die Vision API von Mistral kann diese Diagramme lesen, Trends interpretieren und numerische Daten extrahieren. In dieser Lektion wird gezeigt, wie man Prompts formuliert, die handlungsrelevante Ergebnisse statt vager Kommentare liefern, und wie man die Ausgabe strukturiert.

Prinzipien der Diagrammanalyse

Wenn das Modell allein gelassen wird, produziert es einen allgemeinen Satz wie „dieses Diagramm zeigt die Umsatzentwicklung”. Ein effektiver Prompt erzwingt stattdessen einen geordneten Prozess: Identifizieren Sie den Diagrammtyp (Balken-, Liniendiagramm, Kreis-, Streudiagramm), lesen Sie die Achsen und Legenden mit ihren Einheiten und Skalen, extrahieren Sie Werte durch Annäherung der visuellen Position und interpretieren Sie erst dann Trends – Anstieg, Abfall, Saisonalität, Anomalien. Die Reihenfolge ist entscheidend: Eine Interpretation, die vor dem Lesen der Achsen gebildet wird, ist eine erfundene Interpretation.

Analyse eines Balkendiagramms

Die Systemnachricht ist der natürliche Ort, um diese Methode einmal und für alle Fälle zu kodieren, unabhängig vom zu analysierenden Bild:

from mistralai.client import Mistral
import os

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": """Sie sind ein erfahrener Datenanalyst. Bei der Analyse eines Diagramms:
1. Identifizieren Sie den Diagrammtyp und dessen Titel
2. Beschreiben Sie die Achsen (Beschriftungen, Einheiten, Skala)
3. Listen Sie die Hauptwerte auf, die Sie ablesen können
4. Identifizieren Sie Trends, Hochs/Tiefs und Anomalien
5. Schreiben Sie einen 2-3 Sätze langen Schlusssatz"""
        },
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Analysieren Sie dieses Balkendiagramm des vierteljährlichen Umsatzes."},
                {"type": "image_url", "image_url": "https://exemple.com/ca-trimestriel.png"}
            ]
        }
    ]
)

print(response.choices[0].message.content)

Der Systemprompt strukturiert die Antwort des Modells in logische Schritte, was sowohl die Genauigkeit als auch die Lesbarkeit verbessert. Sie erhalten einen konsistenten Bericht von einem Diagramm zum nächsten, was essenziell ist, wenn diese Antworten später automatisch verarbeitet werden müssen.

Extraktion numerischer Daten

Um verwertbare Daten statt einer Beschreibung zu erhalten, muss die Anweisung explizit restriktiv sein. Das Modell hat eine natürliche Tendenz zu kommentieren; Sie müssen dies untersagen:

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": "Sie sind ein Datenextraktor. Analysieren Sie das Diagramm und geben Sie die Daten als Markdown-Tabelle zurück. Kommentieren Sie nicht, beschreiben Sie nicht – extrahieren Sie nur die Daten."
        },
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Extrahieren Sie die Daten aus diesem Balkendiagramm in eine Tabelle."},
                {"type": "image_url", "image_url": "https://exemple.com/ventes-mensuelles.png"}
            ]
        }
    ]
)

Das Modell wird etwas wie Folgendes zurückgeben:

| Monat    | Umsatz (k€) |
|----------|-------------|
| Januar   | 120         |
| Februar  | 135         |
| März     | 148         |

Dieses Format lässt sich mit wenigen Zeilen Code parsen und direkt in eine Tabelle oder ein DataFrame importieren.

Liniendiagramme eignen sich besonders für die Trendanalyse, und die Frage kann dann zu einem vollständigen Fragebogen im Benutzerprompt werden:

prompt_tendance = """Analysieren Sie dieses Liniendiagramm und beantworten Sie:
1. Was ist der allgemeine Trend (steigend, fallend, stabil)?
2. Gibt es Wendepunkte? Falls ja, an welchen Daten?
3. Beobachten Sie Saisonalität?
4. Was ist der ungefähre Wert am Anfang und Ende des Zeitraums?
5. Welche Projektion machen Sie für das nächste Quartal?"""

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": prompt_tendance},
                {"type": "image_url", "image_url": "https://exemple.com/evolution-prix.png"}
            ]
        }
    ]
)

Die fünfte Frage ist in ihrer Natur von den ersten vier unterschiedlich: Sie fordert eine Extrapolation, nicht das Ablesen. Behandeln Sie die Antwort als Hypothese zur Validierung, niemals als Tatsache.

Analyse eines Kreisdiagramms (Verteilung)

Bei Kreisdiagrammen liegt der Fokus auf Anteilen und Konzentration statt auf Entwicklung:

prompt_camembert = """Analysieren Sie dieses Kreisdiagramm:
- Listen Sie jeden Segment mit seinem ungefähren Prozentsatz
- Identifizieren Sie das dominante Segment
- Geben Sie an, ob die Verteilung konzentriert oder dispergiert ist
Geben Sie die Daten in einer Markdown-Tabelle zurück."""

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": prompt_camembert},
                {"type": "image_url", "image_url": "https://exemple.com/repartition-marche.png"}
            ]
        }
    ]
)

Überprüfen Sie immer, dass die Summe der zurückgegebenen Prozentsätze nahe bei 100 liegt: Eine Summe von 87 % signalisiert ein unvollständiges Ablesen, ein vergessenes Segment oder eines, das von der Legende verdeckt ist.

Analyse-Pipeline für Berichte

Diese isolierten Aufrufe werden nützlich im Maßstab eines gesamten Berichts. Der folgende Skript durchsucht einen Ordner mit exportierten Diagrammen, fordert bei jedem Aufruf eine standardisierte JSON-Ausgabe an und protokolliert alles in einer einzigen Datei:

import base64
from pathlib import Path
from mistralai.client import Mistral
import json

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

def encoder_image(chemin):
    with open(chemin, "rb") as f:
        b64 = base64.standard_b64encode(f.read()).decode("utf-8")
    return f"data:image/png;base64,{b64}"

def analyser_graphique(chemin_image, question=None):
    """Analysieren Sie ein Diagramm und geben Sie strukturierte Daten zurück."""
    if question is None:
        question = "Analysieren Sie dieses Diagramm. Geben Sie ein JSON zurück mit: type (bar/line/pie/other), title, data (array of {label, value}), trend, und summary."

    response = client.chat.complete(
        model="mistral-large-latest",
        messages=[
            {
                "role": "system",
                "content": "Geben Sie nur gültiges JSON zurück, keine Markdown-Code-Blöcke."
            },
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": question},
                    {"type": "image_url", "image_url": encoder_image(chemin_image)}
                ]
            }
        ]
    )

    return response.choices[0].message.content

# Analysieren Sie alle Diagramme in einem Ordner
dossier = Path("rapport/graphiques/")
resultats = {}

for fichier in sorted(dossier.glob("*.png")):
    print(f"Analyse von {fichier.name}...")
    resultats[fichier.name] = analyser_graphique(fichier)

# Ergebnisse speichern
with open("rapport/analyse_graphiques.json", "w", encoding="utf-8") as f:
    json.dump(resultats, f, ensure_ascii=False, indent=2)

Die Anweisung „keine Markdown-Code-Blöcke” vermeidet die klassische Unannehmlichkeit von JSON, das in drei Backticks eingewickelt ist, was das Parsen unterbricht.

Grenzen der Diagrammanalyse

Vier Situationen stellen das Modell vor Herausforderungen, und Sie müssen sie kennen, bevor Sie einen Prozess darum herum aufbauen. Erstens, präzise Werte: Sie werden aus der visuellen Position von Balken oder Punkten geschätzt, mit einem Fehlermarginal von 5 bis 10 %. Zweitens, überladene Diagramme, bei denen mehrere Reihen, Legenden und kleiner Text die Lesbarkeit verschwimmen lassen. Drittens, niedrige Auflösung, die Beschriftungen unscharf oder pixelig und unlesbar macht – denken Sie an die interne Vergrößerung, die in Lektion 2 beschrieben wurde. Schließlich, 3D-Diagramme, bei denen die Perspektive die Höhenmessung mechanisch verzerrt.

Das praktische Fazit ist klar: Für eine präzise Extraktion bevorzugen Sie das Exportieren von Quelldaten als CSV, sofern verfügbar. Die Vision API ist ideal für schnelle Analysen und Synthesen, nicht zum Ersetzen einer Tabellenkalkulation. Sie glänzt, wenn die Quelldaten verloren sind; sie ist eine schlechte Wahl, wenn die Daten greifbar sind.

Kernaussagen

  • Verwenden Sie Mistral Large 3 für die Diagrammanalyse – Präzision ist entscheidend
  • Strukturieren Sie Ihren Prompt in Schritten: Typ, Achsen, Werte, Trends, Schlussfolgerung
  • Fordern Sie explizit ein Ausgabeformat (Markdown-Tabelle, JSON) für verwertbare Daten an
  • Das Modell schätzt Werte mit einer Fehlermarge von 5–10 % – verwenden Sie es nicht für exakte Zahlen
  • Kombinieren Sie die Vision API mit einem CSV-Export für das Beste aus beiden Welten