Frage zum Scatterplot mit Matplotlib

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
snakemake
User
Beiträge: 32
Registriert: Sonntag 6. Juni 2010, 19:20

Hallo,

ich muss ein Scatterplot mit matplotlib machen. Auf die x-Achse sollen Linknamen (WLAN-Verbindungen) und die y-Achse beschreibt die mittlere Qualität des Links in Prozent.

Code: Alles auswählen

#!/usr/bin/python -t
# -*- coding: utf-8 -*-

import pylab
import matplotlib
import matplotlib.pyplot as pyplot

def plot():
    # get high quality links
    links = [(('t9-149', 't9-146'), 80.826086956521735), (('t9-k60a', 't9-k61'), 85.411764705882348), (('t9-169', 't9-137'), 80.82352941176471), (('t9-k60b', 't9-k60a'), 81.5), (('t9-k60b', 't9-k61'), 84.952380952380949), (('a6-009', 'a6-108a'), 80.454545454545453), (('a6-009', 'a6-008'), 82.904761904761898), (('t9-146', 't9-149'), 82.125), (('t9-113', 't9-111'), 82.0), (('a6-107', 'a6-108a'), 81.80952380952381), (('a6-107', 'a6-008'), 82.700000000000003), (('a6-213', 'a6-212a'), 81.829268292682926), (('a6-213', 'a6-215'), 82.581395348837205), (('t9-009', 't9-111'), 80.200000000000003), (('t9-k61', 't9-k60a'), 80.722222222222229), (('t9-k61', 't9-k60b'), 82.38095238095238), (('a6-212a', 'a6-213'), 83.875), (('a6-212a', 'a6-215'), 82.195121951219505), (('a6-215', 'a6-213'), 82.232558139534888), (('a6-215', 'a6-212a'), 81.853658536585371), (('a6-108a', 'a6-009'), 80.795454545454547), (('a6-108a', 'a6-107'), 81.595238095238102), (('a6-108a', 'a6-008'), 81.428571428571431), (('a6-108a', 'a6-108b'), 80.659090909090907), (('a6-008', 'a6-107'), 80.536585365853654), (('a6-008', 'a6-108b'), 81.38095238095238), (('a6-108b', 'a6-008'), 80.666666666666671), (('a6-015', 'a6-017'), 80.631578947368425), (('a6-017', 'a6-015'), 80.65789473684211), (('a6-207', 'a6-205'), 82.357142857142861), (('a6-207', 'a6-208'), 84.261904761904759), (('a6-010', 'a6-011'), 82.595238095238102), (('a6-010', 'a3-106'), 80.047619047619051), (('a6-011', 'a6-010'), 82.428571428571431), (('a6-026a', 'a6-016'), 80.04651162790698), (('a6-026a', 'a6-026b'), 81.522727272727266), (('a6-026a', 'a6-028'), 80.523809523809518), (('a6-026a', 'a6-127'), 83.095238095238102), (('a6-026b', 'a6-016'), 80.11904761904762), (('a6-026b', 'a6-026a'), 85.285714285714292), (('a6-026b', 'a6-028'), 82.285714285714292), (('a6-026b', 'a6-127'), 84.285714285714292), (('a6-028', 'a6-026b'), 82.023809523809518), (('a6-127', 'a6-026b'), 80.5), (('a6-115', 'a6-016'), 80.238095238095241), (('a6-205', 'a6-207'), 80.534883720930239), (('a6-208', 'a6-207'), 80.75), (('a3-020a', 'a3-025'), 80.741935483870961), (('a3-023', 'a3-024'), 80.189189189189193), (('a3-106', 'a3-206'), 81.325581395348834), (('a3-206', 'a3-106'), 81.372093023255815), (('a3-206', 'a3-210'), 80.860465116279073), (('a3-210', 'a3-206'), 80.860465116279073), (('a3-024', 'a3-023'), 80.86486486486487)]
    
    # prepare link information for plot
    linklist = list()
    sum = 0
    for link, quality in links:
        a = link[0]
        b = link[1]
        tmp = a + "--" + b
        linklist.append(tmp)
        sum += quality
    avg_quality = sum / len(links)
    
    # configure x axis
    x = pylab.arange(0, len(links), 1)
    xscal = list()
    for i in range(1, len(links) + 1, 1):
        xscal.append(i)
    pylab.xlabel("Links")
    
    # configure y axis
    y = pylab.arange(1, 100 + 1, 5)
    yscal = list()
    for i in range(0, 100 + 1, 5):
        yscal.append(i)
    pylab.ylabel("Mittlere Qualitaet")
    
    # plot
    y_array = list()
    for link, quality in links:
        y_array.append(int(quality))
    
    pyplot.scatter(x, pylab.array(y_array), s=10, marker = "o")
    pylab.xticks(x, linklist, rotation=90)
    pylab.yticks(yscal)
    pylab.axhline(avg_quality)
    
    pylab.show()
    
if __name__ == "__main__":
    plot()
Ich arbeite seit erst einem Tag mit matplotlib, also ist mein Code nicht gerade optimiert oder gut. Aber etwas stört mich: Die Linknamen auf der x-Achse sind bei mir alle so verdichtet und an den Seiten ist so ein riesiger Freiraum bis zum Ende des Diagramms. Kann man das nicht ändern? So kann man nämlich bei vielen x-Werten die Namen gar nicht mehr richtig lesen...
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

warum tauscht du nicht die x und die y Achse? Die Texte stehen dann untereinander und verbrauche weniger Platz (http://matplotlib.sourceforge.net/examp ... _demo.html)

Sonst könntest du höchstens noch den Text um zb 60° Neigen und die Schriftgrösse ein bisschen kleiner machen:

Code: Alles auswählen

pylab.xticks(x, linklist, rotation=60, fontsize=8, ha='right')
snakemake
User
Beiträge: 32
Registriert: Sonntag 6. Juni 2010, 19:20

Ok, das mit der Schriftgröße find ich super. Aber wenn ich das Skript ausführe und mir mein Plot angezeigt wird, ist zwischen der y-Achse und dem allerersten x-Wert links ein sehr großer Abstand:

Bild

Warum beginnt der erste x-Wert viel weiter in der Mitte? Wenn das nicht so wäre, wäre der Abstand zwischen den x-Achse-Beschriftungen noch viel größer.

EDIT: Egal wie rum ich die Achsen nehme, es taucht das oben genannte Problem auf, also dass an beiden Enden so riesige Abstände entstehen.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Nutze halt andere xlimits.

Grüße
Gerrit
snakemake
User
Beiträge: 32
Registriert: Sonntag 6. Juni 2010, 19:20

Ok, hat funktioniert. xlim war bei mir von -10 bis 60, aber die Liste enthält nur 54 Einträge. Deshalb hab ich xlim von 0 bis len(links) eingestellt und voilà, es klappt 8)

Danke!
Antworten