EXKURS: Visualisierung der Ergebnisse

Python ist eine sehr umfangreiche Programmiersprache. Bisher, habe Sie sie nur zum Übertragen eines Optimierungsmodells in Gurobi und das Auslesen der Ergebnisse benutzt. In diesem Abschnitt zeigen wir Ihnen, wie Sie Ihre Ergebnisse visualisieren können.

Stellen Sie sich folgendes Szenario vor: Das Management ist sehr daran interessiert, wie sich Produktionskosten zu von Transportkosten verhalten und möchte gerne mit einer einfachen Darstellung sehen, welcher Produktionsstandort an welchen Abnehmer liefert. Sie sollen eine Präsentation vorbereiten und brauchen einige Abbildungen. Sie entscheiden sich dazu einige Diagramme mit den Kosten zu erstellen und eine Übersichtskarte mit allen potenziellen Produktionsstandorten und Kunden.

Diagramme

Mit Matplotib können Sie eine sehr große Anzahl verschiedenster Diagramm erstellen. Wir geben zwei Beispiele, ein Pie-Chart und ein Bar-Chart. Generell sollte Matplotlib bereits auf ihrem System mit Anaconda kommen.

Code Pie-Chart

```lang:python;;def plot_shares(transport_cost, production_cost):
    labels = 'Transport', 'Produktion'
    sizes = [transport, production]
    
    fig, ax = plt.subplots()
    fig.set_dpi(100)
    ax.pie(sizes, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90)
    ax.axis('equal')
    
    plt.show()
    fig.savefig('pie_chart.png')```

Ergebnis
Pie-Chart mit zwei Teilen. Der Transportteil deutlich kleiner als der Produktionsteil.
Code Bar-Chart

```lang:python;;def plot_totals_bar(transport, production):

    fig, ax = plt.subplots()
    
    labels = ['Transport', 'Fixed']
    counts = [transport, production]

    ax.bar(labels, counts)
    
    fig.set_dpi(100)
    plt.show()

    fig.savefig('totals.png')```
 
Ergebnis
Bar-Chart der Kosten, Transportkosten sind sehr gering im Vergleich
  

Karten

Mit Geopandas können Sie relative leicht Karten plotten. Es gibt verschiedene Formate, in den Karten bereitgestellt werden. Die Verbreitetsten sind ESRI Shapefiles und Geojson. Wir stellen ein .geojson von NRW bereit: LANDKREISE. (Quelle: GeoBasis-DE / BKG 2013). Weiterhin brauchen Sie die Geo-Koordinaten von den potenziellen Fabriken und Abnehmern. Der Datenumfang ist hier noch überschaubar, deshalb haben wir die Koordinaten einzeln herausgesucht. Es wäre aber auch möglich, diesen Schritt zu automatisieren. Zum Beispiel mit einem Geocoding - Service (e.g. OpenRouteService oder OpenCage).

Zum Installieren von Geopandas folgen Sie bitte der Installationsanleitung: Geopandas Installation Guide

Daten Vorbereiten

```lang:python;;production = [('Krefeld',51.33489008436512, 6.568047013473666),
              ('Herne',51.53771045684371, 7.194962256766569),
              ('Paderborn',51.71909942364076, 8.75057976047261)]

sinks = [('Koeln',50.93386518777527, 6.958973923969869),
         ('Bonn',50.740625840775465, 7.0952987924814),
         ('Duisburg',51.43082091590227, 6.76912922060523),
         ('Muenster',51.96498607848209, 7.617203294554034),
         ('Unna',51.537604178977716, 7.690509013834595),
         ('Bielefeld',52.02833269735831, 8.527475896723134)]```

Karte Plotten

Geopandas mit gpd.read_file(fp) übernimmt alle Arbeit für uns.

```lang:python;;def plot_map():
    fp = "landkreise.geojson"
    data_nrw = gpd.read_file(fp)
    
    fig, ax = plt.subplots()
    data_nrw.plot(ax=ax, facecolor="none", edgecolor="black")```

Daten auf Karte Plotten

ax.scatter zeichnet Punkte auf die Karte. x und y Werte müssen als getrennte Arrays angegeben werden.

```lang:python;;def plot_potential_modules(fig, ax):
    x_values = [value[2] for value in production]
    y_values = [value[1] for value in production]
    ax.scatter(x_values, y_values, c="y", label="Produktion")
    
def plot_sinks(fig, ax):
    x_values = [value[2] for value in sinks]
    y_values = [value[1] for value in sinks]
    ax.scatter(x_values, y_values, c="r", label="Kunden")```

Optimierungsergebnisse Plotten

ax.plot zeichnet hier jede Verbindungslinie einzeln, wenn das Optimierungsergebnis sagt, dass die Verbindung benutzt wird.

```lang:python;;for i in range(len(production)):    
        for j in range(len(sinks)):
            if(x[i, j]. x > 0.001):
                ax.plot([production[i][2], sinks[j][2]],
                        [production[i][1], sinks[j][1]], c='k')```

Ergebnis Problemdarstellung
Kartendarstellung aller möglichen Produktionsstandorte und Kunden

Ergebnis Lösungsdarstellung

Kartendarstellung, die zeigt, welcher Kunde von welchem Standort beliefert wird.
 

  

Hier finden Sie noch einmal die kompletten kommentierten Programmdateien

Legen Sie die Dateien ins gleiche Verzeichnis und führen Sie dann den Hauptprogrammcode aus.
You have completed 93% of the lesson
93%