Seite 1 von 1

Frage zum Scatterplot mit Matplotlib

Verfasst: Mittwoch 2. März 2011, 16:29
von snakemake
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...

Re: Frage zum Scatterplot mit Matplotlib

Verfasst: Mittwoch 2. März 2011, 19:17
von DaMutz
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')

Re: Frage zum Scatterplot mit Matplotlib

Verfasst: Donnerstag 3. März 2011, 11:58
von snakemake
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.

Re: Frage zum Scatterplot mit Matplotlib

Verfasst: Donnerstag 3. März 2011, 12:15
von gkuhl
Nutze halt andere xlimits.

Grüße
Gerrit

Re: Frage zum Scatterplot mit Matplotlib

Verfasst: Donnerstag 3. März 2011, 12:50
von snakemake
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!