[PYTHON] Trennung von Design und Daten in matplotlib

Überblick

Aufgabe

Ich zeichne oft Grafiken aus ** Python ** mit ** matplotlib **. Daten werden von der Anwendung ** Python ** generiert, formatiert und von ** matplotlib ** grafisch ausgegeben.

Zu dieser Zeit hatte ich die folgenden Probleme.

Ursache

Der Code, in den Sie schreiben, ** visualisiert die Daten ** und der Code, in den Sie schreiben, ** verwalten das Design ** Ich dachte, es war, weil es in einer Anwendung geschrieben wurde.

Korrespondenz

Ich habe versucht, den Code für die ** Verwaltung des Designs ** als ** Konfigurationsdatei ** zu trennen.

Einzelheiten

Von den drei genannten Punkten ist das "Grafikdesign nicht einheitlich" Dies bedeutet, dass die ** Etikettengröße **, ** Legende **, ** gezeichneten Punkte ** usw., die der vertikalen und horizontalen Achse zugewiesen sind, nicht einheitlich sind.

Dies hängt auch mit der zweiten Aufgabe zusammen, da ich in einer anderen Python-Datei eine ** ähnliche Beschreibung ** erstellt habe.

Das Problem war, dass es nicht ** vereinheitlicht ** war und ich ** kopierte **, indem ich vor Ort auf frühere Python-Dateien verwies.

Der Grund, warum ** Kopieren und Einfügen ** wiederholt wird, ist das ** Design ** und ** Code **, nach dem ich suche Ich denke, das liegt daran, dass es nicht gebunden ist, zumindest nicht intuitiv. Dies führt zur dritten Herausforderung.

Ich dachte, der Grund für diese drei Herausforderungen war, dass die ** Daten ** und ** das Design ** nicht ** getrennt ** waren.

Wenn ja, ist die Geschichte einfach: Trennen Sie das ** Design ** in eine ** Konfigurationsdatei **.

Drücken Sie Ihr Design in Worten in einer Einstellungsdatei aus

Ich habe versucht, das Design und das Wort wie in der folgenden Tabelle gezeigt zu entsprechen.

Die Bedeutung jedes Artikels ist

ist.

So drücken Sie eine bestimmte Einstellungsdatei aus

Für die Einstellungsdatei haben wir verschiedene Ausdrucksmethoden berücksichtigt, z. B. json und yaml.

Aus diesem Grund habe ich mich entschieden, den Standard ** [configparser] 1 ** für Python zu verwenden.

Ich denke, json und yaml sind in Ordnung, aber ich dachte, es wäre besser, ** intuitiv zu verwenden **, als es hierarchisch auszudrücken.

Die Konfigurationsdatei wird wie folgt durch ** configparser ** dargestellt.

config.ini


[Size]
figure_x=8
figure_y=8
font_title=20
font_x_label=18
font_y_label=18
font_tick=10
font_legend=15
marker=10

[Position]
subplot=111
legend_location=upper right

[Markers]
0=D
1=>
2=.
3=+
4=|

[Color]
0=red
1=blue
2=green
3=black
4=yellow

Elemente, die der ** Designklassifizierung ** entsprechen, sind in ** eckigen Klammern ** eingeschlossen, z. B. ** [Größe] **. Dies wird als ** Abschnitt ** bezeichnet. Schreiben Sie darunter ** parameter = value ** der Einstellungsdatei. Dies wird als ** Schlüssel ** bezeichnet.

Zusätzlich zu ** Größe ** und ** Position ** enthält die obige Konfigurationsdatei auch ** Markierungen (Art der zu zeichnenden Markierungen) ** und ** Farbe (Farbe der zu zeichnenden Markierungen und Linien) **. Es wird ausgedrückt.

Verwenden Sie die in der Konfigurationsdatei beschriebenen Parameter aus Python-Code

Um auf die Parameter in der Konfigurationsdatei zuzugreifen, schreiben Sie den Code wie folgt:


import configparser


rule_file = configparser.ConfigParser()
rule_file.read("Pfad der Konfigurationsdatei", "UTF-8")

hogehoge = rule_file["Abteilungsname"]["Schlüsselname"]

Beachten Sie, dass der Lesewert eine ** Zeichenfolge ** ist.

Beispiel für die tatsächliche Verwendung

Der folgende Code erstellt ein Faltliniendiagramm basierend auf den ** übergebenen Daten ** und der ** Designkonfigurationsdatei **.

make_line_graph.py


"""Funktion zur Erstellung von Liniendiagrammen

Zeichnen Sie mit den übergebenen Daten ein Liniendiagramm und speichern Sie es als Bilddaten.

"""


import configparser
import matplotlib.pyplot as plt


def make_line_graph(data, config="config.ini"):
    """Liniendiagrammzeichnung

Erstellen Sie ein Liniendiagramm mit den übergebenen Daten.
Lesen Sie das Design aus einer anderen Konfigurationsdatei.

    Args:
        data(dict):Enthält zu plottende Daten
        config(str):Der Name der Konfigurationsdatei

    Returns:
        bool:Wenn True, ist die Erstellung abgeschlossen, wenn False, schlägt die Erstellung fehl

    Note:
Der Schlüssel und der Wert, die in den Argumentdaten enthalten sein sollten, werden unten beschrieben.

        key         : value
        ------------------------
        title(str):Name des Diagrammtitels
        label(list):Legendenbeschreibung
        x_data(list):Daten der x-Achse
        y_data(list):Daten der y-Achse
        x_ticks(list):Wert, der im Speicher der x-Achse angezeigt werden soll
        y_ticks(list):Wert, der im Speicher der y-Achse angezeigt werden soll
        x_label(str):Name der x-Achse
        y_label(str):Name der y-Achse
        save_dir(str):Dateipfad speichern
        save_name(str):Dateinamen speichern
        file_type(str):Dateiformat speichern
    """

    rule_file = configparser.ConfigParser()
    rule_file.read("./conf/{0}".format(config), "UTF-8")

    fig = plt.figure(figsize=(int(rule_file["Size"]["figure_x"]), int(rule_file["Size"]["figure_y"])))

    ax = fig.add_subplot(int(rule_file["Position"]["subplot"]))
    ax.set_xlabel(data["x_label"], fontsize=int(rule_file["Size"]["font_x_label"]))
    ax.set_ylabel(data["y_label"], fontsize=int(rule_file["Size"]["font_y_label"]))

    for index in range(len(data["x_data"])):
        ax.plot(data["x_data"][index],
                data["y_data"][index],
                label=data["label"][index],
                color=rule_file["Color"][str(index)],
                marker=rule_file["Markers"][str(index)],
                markersize=int(rule_file["Size"]["marker"]))

    plt.title(data["title"], fontsize=int(rule_file["Size"]["font_title"]))

    if "x_ticks" in data.keys():
        plt.xticks(data["x_ticks"][0], data["x_ticks"][1])

    if "y_ticks" in data.keys():
        plt.yticks(data["y_ticks"][0], data["y_ticks"][1])

    plt.tick_params(labelsize=int(rule_file["Size"]["font_tick"]))
    plt.legend(fontsize=rule_file["Size"]["font_legend"], loc=rule_file["Position"]["legend_location"])
    plt.savefig("".join([data["save_dir"], "/", data["save_name"], ".", data["file_type"]]))

Die Python-Datei, die die Daten übergibt, sieht folgendermaßen aus:

main.py



from make_line_graph import make_line_graph

data = {
    "title": "hogehoge",
    "label": ["A", "B"],
    "x_data": [x_data1, x_data2],
    "y_data": [y_data1, y_data2],
    "x_ticks": [x_ticks1, x_ticks2],
    "y_ticks": [y_ticks1, y_ticks2],
    "x_label": "hogehoge",
    "y_label": "hogehoge",
    "save_dir": "Pfad des Ordners, den Sie speichern möchten",
    "save_name": "Dateiname, den Sie speichern möchten",
    "file_type": "Erweiterung",
}

make_line_graph(data, config="config.ini")

Impressionen habe ich ausprobiert

guter Punkt

Das Design ist leichter zu ändern. Insbesondere variieren verschiedene Schriftgrößen in Abhängigkeit von den zu zeichnenden Daten und der Anzahl der Zeichen, die in das Etikett aufgenommen werden sollen.

Durch Duplizieren und Anpassen der Einstellungsdatei wurde auch die Anzahl der Python-Dateien geändert, wenn Sie das Diagrammdesign ändern möchten. Sie müssen nur den Namen der zu lesenden Einstellungsdatei ändern.

Da das Diagrammdesign und die Einstellungsdatei verknüpft sind, kann man sicher vergessen, welches Design welchem Code entspricht.

Schlechter Punkt

Es ist schwierig, es vielseitig zu machen.

Die ** make_line_graph.py **, die ich erstellt habe, ist eine Funktion zur Erstellung von Liniendiagrammen, aber ich möchte keine ähnlicheren Python-Dateien haben, deshalb habe ich sie so vielseitig wie möglich gemacht. Dies zeichnet das Diagramm jedoch nicht gut, und wenn eine andere Funktion zur Erstellung von Liniendiagrammen überfüllt ist, um ihr zu entsprechen, scheint es, dass sie zur Zeichnung zurückkehrt.

Ich frage mich, ob es angesichts seiner Vielseitigkeit kein Ende gibt.

Recommended Posts

Trennung von Design und Daten in matplotlib
Implementieren Sie "Data Visualization Design # 3" mit Pandas und Matplotlib
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
Installation von SciPy und matplotlib (Python)
Hashing von Daten in R und Python
Versuchsplanungsmethode und Kombinationsoptimierung
Implementieren Sie "Data Visualization Design # 2" mit matplotlib
PyOpenGL GUI Auswahl und Trennung von Zeichnung und GUI
Zusammenfassung der häufig verwendeten Befehle in matplotlib
Zeichnen Sie Daten einfach in Shell und Python
Screenshots des Webfischens mit Selen und Chrom.
Konvertierung von Zeitdaten in 25-Uhr-Notation
Zusammenfassung der Module und Klassen in Python-TensorFlow2-
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Visualisierung von Breiten- / Längenkoordinatendaten (unter der Annahme meteorologischer Daten) unter Verwendung von Cartopy und Matplotlib
Suchen Sie den Namen und die Daten einer freien Variablen in einem Funktionsobjekt
Zeichnen Sie die CSV von Zeitreihendaten mit einem Unixtime-Wert in Python (matplotlib).
Zusammenfassung der Wahrscheinlichkeitsverteilungen, die häufig in Statistiken und Datenanalysen vorkommen
Python: Vorverarbeitung beim maschinellen Lernen: Umgang mit fehlenden / Ausreißern / unausgeglichenen Daten
Visualisieren Sie Korona-Infektionsdaten in Tokio mit matplotlib
Zusammenfassung der 2016 erstellten OSS-Tools und -Bibliotheken
Python-Variablen und Datentypen, die mit Chemoinfomatik gelernt wurden
[Python] Vertauschen von Zeilen und Spalten mit Numpy-Daten
Echtzeitvisualisierung von Thermografie AMG8833-Daten in Python
Glättung von Zeitreihen und Wellenformdaten 3 Methoden (Glättung)
Der Header ist falsch ausgerichtet mit read_csv () und read_table () von Pandas
Wenn sich Achse und Beschriftung in matplotlib überlappen
Data Science Workloads und RTVS in Visual Studio 2017
Die Geschichte des Lesens von HSPICE-Daten in Python
Koexistenz von Anaconda 2 und Anaconda 3 in Jupyter + Bonus (Julia)
Datenbereinigung 3 Verwendung von OpenCV und Vorverarbeitung von Bilddaten
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Erläuterung der Bearbeitungsentfernung und Implementierung in Python
Ich habe ein gestapeltes Balkendiagramm mit matplotlib von Python erstellt und eine Datenbeschriftung hinzugefügt
"Lineare Regression" und "Probabilistische Version der linearen Regression" in Python "Bayes lineare Regression"
Analyse von Finanzdaten durch Pandas und deren Visualisierung (2)
Über Importfehler von numpy und scipy in anaconda
Liste der Python-Bibliotheken für Datenwissenschaftler und Dateningenieure
Analyse von Finanzdaten durch Pandas und deren Visualisierung (1)
Trennung von japanischem Nachnamen und Vornamen mit BERT
Lassen Sie die Häkchen nach dem Dezimalpunkt in matplotlib weg
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Übersicht und Tipps von Seaborn mit statistischer Datenvisualisierung
[Python] Berechnung der Differenz von Datum und Zeit in Monaten und Jahren
Leistungsüberprüfung der Datenvorverarbeitung in der Verarbeitung natürlicher Sprache
Den Inhalt der Daten in Python nicht kennen
Liste des Python-Codes, der bei der Big-Data-Analyse verwendet wird
Ungefähr 200 Breiten- und Längengraddaten für Krankenhäuser in Tokio
Verwenden wir die offenen Daten von "Mamebus" in Python
Analyse der Messdaten (2) -Hydrobacter und Anpassung, lmfit Empfehlung-
Visualisierung von Daten anhand einer erklärenden Variablen und einer objektiven Variablen
Beispiel für das Abrufen des Modulnamens und des Klassennamens in Python
Überblick über die Verarbeitung natürlicher Sprache und ihre Datenvorverarbeitung
Zusammenfassung der Datumsverarbeitung in Python (Datum / Uhrzeit und Datum)
Legen Sie matplotlib in Centos7.