PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pgfplots Problem



Helveticus
23-12-2012, 16:43
Hallo

Ich möchte einen 2D Graphen Zeichen. Dazu habe ich folgenden Code.


\documentclass[pdftex,11pt,openright,headsepline]{book}
\usepackage{pgfplots}
\pgfplotsset{compat = newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xlabel=m+n+d$^{2}$,
ylabel=Exectuion Time~(s)]
\addplot table[row sep=\\,x=m+n+d^2,y=runtime(s)] {figures/graphs/test.txt};
\end{axis}
\end{tikzpicture}
\end{document}


Die x- und y-Achsen Werte sind in einer .txt Datei gespeichert. Siehe Anhang.

Mein Problem ist nun, dass zwar keine Fehlermeldung kommt, die Kompilierung aber unendlich lange läuft.

Was habe ich da falsch gemacht?

By the way, wie kann man die Kompilierung abbrechen ohne den Prozess zu killen? Ich verwende den Texmaker.

Edit: Ich konnte das Problem selber lösen. Ich habe die new line symbols inklusive row sep=\\ entfernt. Jetzt funktioniert es. Habe aber wohl bald noch ein paar andere Fragen bezüglich der Graphen. ;)

Helveticus
23-12-2012, 19:07
So, ich konnte jetzt dank sehr guten Anleitungen fast alles Probleme selber lösen. Drei Probleme bzw. Fragen sind noch übrig.

1. Beschriftet man die Achsen in einer Arbeit mit 0.5 / 0,5 und 2,500 / 2500? Also wird ein Komma oder Punkt gebraucht und werden tausender Zahlen getrennt? So weit ich jetzt gelesen habe, scheint 0.5 und 2,500 amerikanisch zu sein, bin mir aber nicht sicher.

2. Mein Graph sieht zur Zeit wie im Anhang aus. Was mit da nocht stört ist, dass das *10^6 so weit rechts ist. Kann man das nicht weiter links schreiben? Und ist das da überhaupt die korrekte Position? So weit ich das in Erinnerung habe, sollte der Faktor ja eigentlich auf Achsenhöhe stehen.

3. Den Graphen kann ich ja auch "smooth" plotten lassen, das würde dann schöner aussehen. Plottet man so einen Graphen normalerweise smooth oder nicht?

Feuersaenger
23-12-2012, 21:59
Hallo Helveticus,

Dein Graph sieht ganz gut aus. Schoen, dass Du Dir selber helfen konntest. Allerdings habe ich nur durchs lesen noch nicht verstanden, warum das row-sep ding jetzt so viel laenger dauern sollte ... ? Egal, solange es klappt.

Zu Deinen Fragen:

1. Wenn Du eine internationale Arbeit hast, wuerde ich den punkt als dezimaltrenner und das komma als tausenderseparator nehmen (d.h. die Voreinstellung). Wenn Du allerdings lediglich 4-stellige Zahlen hast, wuerde ich ohne 1000er separator arbeiten. In pgfplots hiesse das 'yticklabel style={/pgf/number format/1000 sep={}}' .

2. Gibt es eine "richtige" Position fuer dieses tick scale label? Egal, die Voreinstellung ist

/pgfplots/every x tick scale label/.style={at={(xticklabel cs:0.9,5pt)},anchor=near xticklabel,inner sep=0pt},
wenn man diesen style redifiniert, kann man das anpassen. Vielleicht mit
xticklabel cs:1.1,0pt ?

3. "smooth" sollte man dann und nur dann nehmen, wenn es sich mit dem theoretisch zu erwartenden Modell deckt. In Deinem Fall *darfst* Du kein smooth machen, sonst sieht man ja nichts mehr von den Daten! Daumenregel fuer "smooth": Smooth darf man hoechstens dann machen, wenn man genau weiss, dass die Funktion im Fall von unendlichen vielen Datenpunkten keine Knicke hat und keine Sprungstellen.

Helveticus
23-12-2012, 23:48
Ich danke dir für deine Antwort.


Allerdings habe ich nur durchs lesen noch nicht verstanden, warum das row-sep ding jetzt so viel laenger dauern sollte ... ? Egal, solange es klappt.

Was war nicht langsamer, sondern hat gar nicht funktioniert. ;) Habe da wohl einen Fehler gemacht.


1. Wenn Du eine internationale Arbeit hast, wuerde ich den punkt als dezimaltrenner und das komma als tausenderseparator nehmen (d.h. die Voreinstellung). Wenn Du allerdings lediglich 4-stellige Zahlen hast, wuerde ich ohne 1000er separator arbeiten. In pgfplots hiesse das 'yticklabel style={/pgf/number format/1000 sep={}}' .

Es handelt sich um eine Bachelor-Arbeit an einer Schweizer Uni. Zählt das denn als internationale Arbeit? ;) Ich habe höchstens 4-stellige Zahlen.


Gibt es eine "richtige" Position fuer dieses tick scale label?

Das weiss ich nicht, nur so wie es zur Zeit ist, siehts nicht so gut aus.

Wo muss ich denn "xticklabel cs:1.1,0pt" hinmachen bzw. wie redefiniere ich das?



3. "smooth" sollte man dann und nur dann nehmen, wenn es sich mit dem theoretisch zu erwartenden Modell deckt. In Deinem Fall *darfst* Du kein smooth machen, sonst sieht man ja nichts mehr von den Daten! Daumenregel fuer "smooth": Smooth darf man hoechstens dann machen, wenn man genau weiss, dass die Funktion im Fall von unendlichen vielen Datenpunkten keine Knicke hat und keine Sprungstellen.

Im Anhang ist noch ein Screenshot wie es mit smooth aussieht. Es sieht halt doch schöner aus, finde ich, hat keine Kanten. ;)

By the way, bei kleinen x-Werte (nahe 0), bei 0.5 und kurz vor 1 habe ich mehr Datenpunkte als an den übrigen Stellen (sieht man an der stärker alternierenden Kurve). Ist das ein Problem?

hakaze
24-12-2012, 00:22
smooth oder Verbindungslinien im Allgemeinen sind tricky, denn wie Christian schon andeutete, gaukeln solche Darstellungen Datenpunkte und Zusammenhänge vor, wo keine sind bzw. wo keine experimentellen Daten vorliegen. In dem Fall wäre eigentlich ein dot-plot oder Punkte mit angedeuteter Linien die wissenschaftlich "richtige" Lösung.

Anders formuliert: nur wenn deine Daten bzw. das Model, nach dem du rechnest, kontinuierlich sind, sollte der Kurvenverlauf auch kontinuierlich sind.
Hast du diskontinuierliche Daten (d.h. nur einzelne Messpunkte), sollte der Plot das auch repräsentieren; sprich: nur Punkte plotten.

Zum Thema Punkt oder Komma gibt es wohl keine einheitliche Festlegung in der Schweiz (http://de.wikipedia.org/wiki/Dezimaltrennzeichen#Schweiz).

Helveticus
24-12-2012, 12:25
...oder Punkte mit angedeuteter Linien die wissenschaftlich "richtige" Lösung.

Was meinst du mit angedeuteter Linie? Eine gestrichelte Linie?

Ich habe jetzt noch einmal einen anderen Plot erstellt, wo die Datenpunkte auch geplottet werden. Siehe Bild im Anhang.

Meinst du sowas? Oder gleich die Linien dazwischen auch weglassen oder gestrichelt machen? Ich Paper, die ich gelesen habe, wurden teilweise nur die Punkte geplottet oder die Punkte + eine (nicht smoothe) Verbindungslinie).

Mein Problem hier ist, dass die Datenpunkte nicht schön verteilt sind, d.h. an gewissen Stellen gibt es eine grössere Ansammlung und das sieht irgendwie unschön aus, daher habe ich es zuerst auch ohne Punkte geplottet. Ich könnte zwar Datenpunkte löschen, so dass sie besser verteilt sind, allerdings möchte ich nicht unbedingt an meinen Messresultaten herumfummeln und ich habe lieber mehr als weniger Datenpunkte. ;)

hakaze
24-12-2012, 12:35
Was meinst du mit angedeuteter Linie? Eine gestrichelte Linie?
Ja, genau so meinte ich das: eine gestrichelte oder haardünne Linie.

Wenn die Datenpunkten nicht so "schön" verteilt sind, ist das ja eine Sache, die man im Diskussionsteil erläutern kann. Das ist die richtige Einstellung:
allerdings möchte ich nicht unbedingt an meinen Messresultaten herumfummeln und ich habe lieber mehr als weniger Datenpunkte.
Schöne Feiertage noch!

fps
24-12-2012, 14:25
Mein Problem hier ist, dass die Datenpunkte nicht schön verteilt sind, d.h. an gewissen Stellen gibt es eine grössere Ansammlung und das sieht irgendwie unschön aus, daher habe ich es zuerst auch ohne Punkte geplottet. Ich könnte zwar Datenpunkte löschen, so dass sie besser verteilt sind, allerdings möchte ich nicht unbedingt an meinen Messresultaten herumfummeln und ich habe lieber mehr als weniger Datenpunkte. ;)
Du könntest eventuell noch probieren die x-Achse logaritmisch darzustellen, vielleicht bringt das etwas, siehe logaxis in der Dokumentation.


Zur Frage bezüglich der Position des Multiplikators, du kannst z.B.

\pgfplotsset{every x tick scale label/.style={at={(xticklabel cs:1.1,0pt)},anchor=near xticklabel,inner sep=0pt}}
in der Präambel schreiben.

Und bei Execution Time würde ich eher ... in s oder [s] schreiben, aber nicht (s);)

Helveticus
24-12-2012, 15:54
Ja, genau so meinte ich das: eine gestrichelte oder haardünne Linie.

Wie bekomme ich so eine Linie (gestrichelt und auch eine haardünne) in schwarz hin? Zudem würde ich gerne die Punkte (auch in schwarz) etwas kleiner machen, geht das auch?


Wenn die Datenpunkten nicht so "schön" verteilt sind, ist das ja eine Sache, die man im Diskussionsteil erläutern kann.

Ja, das stimmt. Aber findest du nicht, dass das Bild mit den Punkten irgendwie unschön aussieht, das an gewissen Stellen so viele Punkte sind? Ich finde irgendwie das Bild ohne Punkte visuell ansprechender.


Du könntest eventuell noch probieren die x-Achse logaritmisch darzustellen, vielleicht bringt das etwas, siehe logaxis in der Dokumentation.

Habe ich schon probiert, sieht aber nicht schön aus. Die Punkte auf der x-Achse sind dann zwar mehr in die Länge gezogen, aber die Linien dazwischen sehen dann sehr komisch aus. Ich könnte höchstens noch probieren eine logarithmische x-Achse zu nehmen, aber dann halt nur Punkte ohne Linien zu plotten.

Edit: Ich habs jetzt noch einmal bei einem anderen Datenset ausprobiert (das ich auch plotten) muss. Dort gibt es mit einer logarithmischen x-Achse ein schöner verteiltes Bild. Wie sind denn die Werte mit einer logarithmischen x-Achse zu interpretieren? Ist ja eigentlich eine Verzerrung der Daten. Und ist es kein Problem, wenn man Graphen mit normalen Achsen und Graphen mit einer logarithmischen x-Achse (für verschiedene Datensets) hat oder müsste das innerhalb eines Dokuments nicht konsistent gleich sein?


Und bei Execution Time würde ich eher ... in s oder [s] schreiben, aber nicht (s)

Ok, werde ich ändern. Bei einem Paper stand eben (s), daher ich das so gemacht.


Schöne Feiertage noch!

Vielen Dank, Dir (euch) auch.

Feuersaenger
24-12-2012, 23:15
Hallo Helveticus,

ich finde dass Dein Bildchen mit den zick-zack-linien deutlich besser aussieht als dass mit "smooth". Das mit smooth hat naemlich nicht mehr viel mit Deinen Messwerten zu tun; Du verschleierst damit fast alles ungewollt.

Da Du eine stark oszillierende Funktion ("zick-zack") hast, solltest Du nicht auf gestrichelte linien zurueck greifen. Solche sind - je nach Drucker - ohnehin sehr viel schwerer zu verfolgen als durchgezogene, um so mehr bei starken oszillationen.

Die Farbe schwarz und die gewuenschten anpassungen der Marker bekommst Du mit


\addplot[black, mark=*, mark size=2pt, ] ...

hin.

Es sei bemerkt, dass "\addplot[black]" anders ist als "\addplot+[black]": ersteres schmeisst die aktuelle farb- und style gebung des plots weg und setzt neue optionen waehrend zweitere die vorgabe behaelt und optionen noch dranhaengt (vgl. manual).

Die Sache mit dem multiplikator solltest Du mal wie von "fps" angeregt ausprobieren.

Die inhomogene (d.h. regional unterschiedliche) Markerverteilung ist eine Frage der Betrachtung. Interessant ist hoechstens die Frage, warum Du dort, wo die Funktion ohnehin wenig variiert, viele Auswertungen hast, waehrend dort, wo richtig fette Spruenge sind, nur wenig Auswertungen vorliegen. Vielleicht ein Messproblem? Egal; in jedem Fall kannst Du die Marker was kleiner machen. Dann sind sie weniger dominant. Falls sie Dich stoeren, kannst Du sie auch fix mit "y=0" oder so setzen - dann sieht man an der Markerverteilung, wie die funktion ausgewertet wurde (dazu gibts irgendwo beispiele im Manual).

Ein Wechsel auf logarithmische Koordinaten erscheint mir bei Dir eher kontraproduktiv: die x achse enthaelt ja eine Summe von irgendwelchen Sachen. Wenn Du daraus den log ziehst, kann keiner mehr was erkennen. Bei einem Produkt waere ein log u.U. hilfreich, aber hier wuerde ich das nur machen, wenn es irgendeine sinnvolle Erklaerung gibt. Der Ansatz "man sieht die Datenpunkte fuer kleine m+n+d^2 besser" ist zwar nachvollziehbar, aber im Grunde verzerrst Du dafuer doch sehr stark die gesamte Abbildung. Das wuerde ich nicht tun. Was soll man denn spaeter daran sehen koennen, d.h. was ist Deine "Message"? Das solltest Du klaeren. Hoechstwahrscheinlich taucht in dem, was Dir nun durch den Kopf geht, keinerlei log auf. Dann sollte das auch in der Abbildung nicht sein.

Deine Abbildung scheint darauf hin zu deuten, dass nicht allein die Summe der drei Komponenten m,n,d die Laufzeit beeinflusst - sondern dass die Einzelkomponenten anders gekoppelt sind. Als Leser Deines plots wuerde mich interessieren, ob die sprungartigen Veraenderungen mit sprungartigen Veraenderungen von einem der Werte in (m, n, d) zu tun haben. Sprich: warum zeigst Du die Summe? aber das weisst Du sicher besser (und musst es auch nicht hier erklaeren).

Helveticus
25-12-2012, 16:05
Ich danke dir Feuersaenger.


Da Du eine stark oszillierende Funktion ("zick-zack") hast, solltest Du nicht auf gestrichelte linien zurueck greifen. Solche sind - je nach Drucker - ohnehin sehr viel schwerer zu verfolgen als durchgezogene, um so mehr bei starken oszillationen.

Ok, das sehe ich ein. Allerdings muss ich auch einen weiteren Graphen erstellen, wo ich zwei Funktionen plotte. Da ich schwarz plotten möchte, müsste ich die zweite Funktion ja irgendwie gestrichelt darstellen. Oder wie würdest du das machen?


Die inhomogene (d.h. regional unterschiedliche) Markerverteilung ist eine Frage der Betrachtung. Interessant ist hoechstens die Frage, warum Du dort, wo die Funktion ohnehin wenig variiert, viele Auswertungen hast, waehrend dort, wo richtig fette Spruenge sind, nur wenig Auswertungen vorliegen. Vielleicht ein Messproblem?

Das liegt an den vorhandenen Testdaten und lässt sich so auf die Schnelle leider nicht ändern. Es handelt sich um einen Algorithmus, für den ich die Runtime messe. Die X-Achse beschreibt die Komplexität.


Egal; in jedem Fall kannst Du die Marker was kleiner machen. Dann sind sie weniger dominant.

Oder die Marker bzw. Punkte gleich ganz weglassen und nur die reine Funktion plotten, so wie ich es am Anfang hatte? Sieht für mich irgendwie schöner aus.


Falls sie Dich stoeren, kannst Du sie auch fix mit "y=0" oder so setzen - dann sieht man an der Markerverteilung, wie die funktion ausgewertet wurde (dazu gibts irgendwo beispiele im Manual).

Das wäre eine gute Idee. Kann man das irgendwie auch so machen, dass man dann auf der x-Achse keine Punkte, sondern nur so schmale Ticks hat (we bei einer log Skala)? Wenn dann viele Messpunkte Nahe beieinander liegen, kann es aber sein, dass das dann wie ein Balken aussieht.

Edit: Habe jetzt im manual nachgeschaut. Dort steht zwar was über Marker drin, habe aber sonst nichts gefunden. Hast du da genauere Angaben?


Ein Wechsel auf logarithmische Koordinaten erscheint mir bei Dir eher kontraproduktiv: die x achse enthaelt ja eine Summe von irgendwelchen Sachen. Wenn Du daraus den log ziehst, kann keiner mehr was erkennen. Bei einem Produkt waere ein log u.U. hilfreich, aber hier wuerde ich das nur machen, wenn es irgendeine sinnvolle Erklaerung gibt. Der Ansatz "man sieht die Datenpunkte fuer kleine m+n+d^2 besser" ist zwar nachvollziehbar, aber im Grunde verzerrst Du dafuer doch sehr stark die gesamte Abbildung. Das wuerde ich nicht tun. Was soll man denn spaeter daran sehen koennen, d.h. was ist Deine "Message"? Das solltest Du klaeren. Hoechstwahrscheinlich taucht in dem, was Dir nun durch den Kopf geht, keinerlei log auf. Dann sollte das auch in der Abbildung nicht sein.

Ich muss noch einen anderen Graph plotten (mit anderen Testdaten). Siehe Bilder im Anhang. Es handelt sich da auch um ein Performance Measurement eines Algorithmus. Die x-Achse stellt die Zeitkomplexität dar. Wegen den Testdaten sind die Messpunkte wieder ungleichmässig verteilt.

Im Anhang ist ein Bild mit normalen Achsen und eines mit logarithmischer x-Achse.

Hier würde eine log x Achse Sinn machen? Denn dann sind die Punkte ja viel schöner verteilt. Oder kann man dann die Resultate nicht mehr interpretieren? Allerdings müsste ich dann auch mit den Punkten leben und könnte keine Ticks auf der x-Achse für die Punkte machen (also y=0), da die logarithmische Skala ja schon Ticks einführt.


Deine Abbildung scheint darauf hin zu deuten, dass nicht allein die Summe der drei Komponenten m,n,d die Laufzeit beeinflusst - sondern dass die Einzelkomponenten anders gekoppelt sind. Als Leser Deines plots wuerde mich interessieren, ob die sprungartigen Veraenderungen mit sprungartigen Veraenderungen von einem der Werte in (m, n, d) zu tun haben. Sprich: warum zeigst Du die Summe? aber das weisst Du sicher besser (und musst es auch nicht hier erklaeren).

Die Summe (bzw. das Produkt im zweiten Graphen) ist die Laufzeitkomplexität. Die sprunghaften Veränderungen (bzw. die nicht monoton wachsende Funktion) kommt von einem preprocessing step des Algorithmuses. Das werde ich aber alles beschreiben. ;)

Edit:
\pgfplotsset{every x tick scale label/.style={at={(xticklabel cs:1.1,0pt)},anchor=near xticklabel,inner sep=0pt}}

hat nichts gebracht. Der Multiplikator ist jetzt sogar noch weiter rechts.

fps
25-12-2012, 19:47
Edit:
\pgfplotsset{every x tick scale label/.style={at={(xticklabel cs:1.1,0pt)},anchor=near xticklabel,inner sep=0pt}}

hat nichts gebracht. Der Multiplikator ist jetzt sogar noch weiter rechts.
Dann wirst du wohl an den Werten ein bisschen rumprobieren müssen :p

Feuersaenger
25-12-2012, 20:20
Hallo Helveticus,

ich denke nach wie vor, dass Du von einer log skalierung die Finger lassen solltest. Daran erkennt man ja nichts mehr - man sieht lediglich mehr von den Datenpunkten, die ohnehin nicht so spannend sind. Und man kann auch nicht einfach Rueckschluesse auf Deiner Summe machen. Ein log skalierung macht zuweilen sehr grossen Sinn, aber hier sehe ich das nicht. Aber das wirst Du einfach entscheiden und ggf. argumentieren muessen.

Bzgl. Linienstyles: Du hast recht, fuer schwarz-weiss und mehreren Plots pro Achse wirst Du an gestrichelten Linien nicht vorbei kommen. In dem Fall wuerde ich aber nahelegen, die Marker zu zeichnen. Am Besten wohl mit ner kleineren Mark size.

Nebenbei: wenn Du die marker zeichnest, wird auch deutlich, dass manche von den grossen Spruengen ausreisser sind (die bei Laufzeitmessungen ja immer zu erwarten sind).

Soweit, ich denke, Du damit das Bild schlicht fertigmachen solltest und genug Entscheidungsgrundlagen hast. Wenn Du auf technische Schwierigkeiten stoesst und im Manual nichts findest, kannst Du nochmal einen neuen Thread aufmachen.