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.
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.
Ich habe versucht, den Code für die ** Verwaltung des Designs ** als ** Konfigurationsdatei ** zu trennen.
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 **.
Ich habe versucht, das Design und das Wort wie in der folgenden Tabelle gezeigt zu entsprechen.
Die Bedeutung jedes Artikels ist
ist.
** Größe (Größe einstellen) **
Horizontale Größe der Figur - pyplot.figure(figsize=(figure_x, figure_y))
Die vertikale Größe der Figur
Gleich wie figure_x
Titelschriftgröße - pyplot.title(fontsize=font_title)
Schriftgröße der X-Achse - pyplot.figure.add_subplot().ax.set_xlabel(fontsize=font_x_label)
Schriftgröße der Y-Achse - pyplot.figure.add_subplot().ax.set_ylabel(fontsize=font_y_label)
Die Größe der Schriftart im Speicher der Achse - pyplot.tick_params(labelsize=font_tick)
** Position **
Wo soll das Diagramm platziert werden? - pyplot.figure.add_subplot(subplot)
Position im Diagramm, an der die Legende platziert ist - pyplot.legend(loc=legend_location)
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.
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.
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")
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.
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