# # Diese Tips stammen von Sara Buerkle # # einzelne Zahlen einlesen var <- scan("filename") # density plotten plot(density(var)) # density logarithmisch plotten plot(density(var), log="x") # mit Titel, Bezeichnung, bestimmter x-range... plot(density(b2okt8wr0), col="green", log="x", main="Offset Beacon2", xlim=range(2:1200), ylim=range(0,0.15), sub="Kollektor rrc00, wochenweise, rot ab 1.10., gruen ab 8., blau ab 15., schwarz ab 22.10.", xlab="Abstand (sec) zum naechsten Event") # weitere Linien dazuzeichnen lines(var2) # (x,y)-Tupel einlesen elements <- read.table("filename") # weitere Punkte hinzumalen, in rot points(elements2, col="red") # Postscript-Plot erzeugen (speichern) postscript("plotfilename.ps") [plotten usw.] dev.off() # Noch ein Beispiel mit Titel etc. > plot(density(bR0okt1wrvOhneOffset), col="orange", main="Offset Routeviews", + ylim=range(0,0.02), xlab="Abstand(sec) zum naechsten Event *ohne* Offset", + sub="Routeviews, alle Beacons (o.2), jeweils eine Woche, je 3 Tage versetzt", + xlim=range(0,400)) > lines(density(bR0okt4wrvOhneOffset), col="red") > lines(density(bR0okt7wrvOhneOffset), col="violet") > lines(density(bR0okt10wrvOhneOffset), col="blue") > lines(density(bR0okt13wrvOhneOffset), col="green") > leg.txt <- c("1.-7.10.", "4.-11.10.", "7.-13.10.", "10.-16.10.", "13.-19.10.") > col <- c("orange", "red", "violet", "blue", "green") > lty <- c(1,1,1,1,1) > legend(list(x=270, y=0.018), legend = leg.txt, col = col[1:5], lty = lty, + merge = TRUE, bty="n") # Standard von Olaf: par(ps=8, lwd=3) col <- c( "black", "red", "darkolivegreen4", "blue", "yellow", "green", "cyan", "chocolate" ) leg <- c("RRC:1-C", "RRC:1-D", "RRC:1-E", "LISP:1-A", "LISP:1-B") legend( leg.x, leg.y, leg, col = col[1:n], lty = lty[1:n], pch = 1:n, merge = TRUE, y.intersp=.8, bty="n", cex=2.5) # lty line type; pch Punktform, merge=TRUE damit alle col, lty... zusammen # gezeichnet werden, bty="n" macht _keine_ Box um die Legende # cex skaliert alles zusammen, auch ps (fontsize) und lwd (line width) # diese vorige Zeile stimmt nicht. cex nur fuer die Punkte im Diagramm. # meine Lieblingskonfig momentan (Abend 13.11.02): pch=16, cex=0.3 # zumindest fuer A4-Ausdruck. Wie das psnupt-8 aussieht... # Auszug aus ~/Output/beacons/aspath/updateDistribution/Rcode-20021114.2009.txt helper <- read.table("/home/sara/Output/beacons/updateDistribution/helper.data") postscript("/home/sara/Output/beacons/updateDistribution/ps_out/b1rrc00_Oct27_1day-20021114.2009.ps") b1rrc00ann <- read.table("/home/sara/Output/beacons/updateDistribution/1-beacon_Oct27_1day_announcements_rrc00_20021114.2009.data") b1rrc00wd <- read.table("/home/sara/Output/beacons/updateDistribution/1-beacon_Oct27_1day_withdrawals_rrc00_20021114.2009.data") plot(helper, main="Update-Verteilung rrc00, Beacon 1, Daten ab 27. Oktober ueber 1 Tag\n mit variation durch (ASPfadlaenge-2)*0.04 (mit DUPs, mit Obergrenze 0.3)", xlab="Zeitpunkt des Updates seit Event", col="white", log="x", xlim=range(1,7200), ylim=range(1,13), ylab="nach Peers gruppiert, unten A-Event, oben W-Event", sub="Withdrawals sind rot, Announcements blau, cex=0.3, pch=16") points(b1rrc00ann, col="blue", cex=0.3, pch=16) points(b1rrc00wd, col="red", cex=0.3, pch=16) dev.off() # eigene Achsen-Beschriftung: plot(...,axes=FALSE) box() # macht einen Rahmen drumrum axis(2,labels=paste("Peer",1:10),at=1:10) # beschriftet y-Achse mit Peer 1 bei y=1, Peer 2 bei y=2... bis y=10. events <- c(100,200,303,411,412) axis(2,labels=paste("Event ",events[1:5]), at=1:5) # beschriftet mit Event 100 bei y=1, ..., Event 412 bei y=5. axis(1) # macht Default-x-Achsen-Beschriftung # R-Speicher loeschen: rm(list = ls()) # und anschl. Save workspace image? _y_! # Text annotieren an Linien oder Geraden: text(1600,0.0003, labels="1300s", pos=4) # schreibt 1300s rechts von (1600,0.0003) # Vorsicht: zentriert an den gegebenen Punkt, wenn pos nicht gegeben ist, # pos aus {1,2,3,4}, 1 below, 2 to the left, 3 above, 4 to the right. # 2e-04 auf x-Achsenbeschriftung bedeutet 0.0002 # also 0.(Zahl hinten -1 Nullen)(Zahl vorne) # Geraden einzeichnen x <- c(1200,1200) y <- c(0,1) lines(x,y) # besser: abline(v=1200) # horizontal abline(h=0.004) # Breite der Histogramm-Balken bestimmen hist(interOkt, br=360) # oder auch plot(hist(interOkt, br=360)) # zerlegt die x-Range in 360 Teile. # Bei z.B. 7200 sek macht das Bloecke von 50 sek Breite. # das funktioniert leider nicht immer. Pattern noch nicht erkannt. # Werte ausfiltern plot(density(d[d>700])) # Histogramm hist(blubb, breaks=30) #=> 30 Balken hist(blubb, breaks=c(1.5,2.5,...) #=> explizite Trennwerte in Vektor # Geraden (mit Steigung) abline(5400, 1, col="green") # hat Steigung 1 und Achsenabschnitt 5400 # auf Englisch: abline(intercept, slope, ...) # nur einen Teil eines Vektors anzeigen (wie Farben): colors()[101:190] # rgb einer Farbe: col2rgb("khaki") red 240 green 230 blue 140 # um sie als Farbe anzugeben, braucht man allerdings den hex-Wert (-> z.B. bc in der Shell, obase=16 eingeben, danach gibt 240 den Hexwert aus.) plot(..., col="#F0E68C") # rot/gruen/blau-Anteil als 2stellige Hexwerte # Fuer Folien und Drucke usw. braucht man doch dickere Linien, sowas wie plot(..., cex.main=1.4, lwd=3, cex.axis=1.4, cex.lab=1.4, cex=0.5,...) abline(..., lwd=2) text(..., cex=1.5) # Dann sieht's ganz harmonisch aus. # Und um das Ganze etwas farbunabhaengiger zu kriegen, sollte man # noch Symbole einflechten. Das ist deshalb nicht-trivial, weil die # im richtigen Abstand auftauchen sollten. # Hier die Tipps, die ich von Olaf gekriegt habe: par(ps=20, lab=c(8,4,7)) adj <- 2 d <- scan("rtg-dist-A-all") plot( density( d[d>0], adjust=adj ), col="red", lty=1, xlim=c(0,20), ylim=c(0, +0.1), xlab="distance", ylab="probability density", main="", type="l", lwd=3) sel <- round( seq(1,2000, length=77), 0 ) # rundet Dezimalzahlen. seq(from, to, length): sequence from to with des. length selx <- density(d[d>0], adjust=adj) sx.x = selx$x sx.y = selx$y points( sx.x[sel], sx.y[sel], pch=1, col="red", cex=1.6, lwd=2 ) # er sagt selbst, dass man mit adj/length laenger spielen muss, bis das # rauskommt, was man gerne haette. # par(lab=c(8,4,7)): # c(x, y, len) aendert die Annotierungsart der Axen: # x, y geben die ungefaehre Anzahl Tickmarks an, 'len' label size. # default: c(5,5,7), len nicht implementiert. # bedeutet also: mehr Ticks auf x, weniger auf y-Achse. Hm. # par(ps=20): point size von Text und Symbolen (die auch von anderem # beeinflusst werden) # vorher hatte ich legend(..., cex=1.5), aber mit par(ps=20, lab=c(8,4,7)) # was man anscheinend vor jedem Plot wiederholen muss, braucht man kein cex, # dafuer: legend(..., y.intersp=1.3) # das macht genuegend Raum zwischen die Aufzaehlungen, die sonst aneinander # gequetscht werden. # Moeglichkeit zum Perfektionieren des Symbol-Setzens: selx <- density(var) # Density-x- und y-Werte sx.x = selx$x # Vektor aus x-Werten sx.y = selx$y # Vektor aus y-Werten sel.try <- c(1:100*10) # Probe: alle 10 Vektorwerte points(sx.x[sel.try], sx.y[sel.try], pch=4, col="red", cex=1.6, lwd=2) points(sx.x[sel.try], sx.y[sel.try], pch=1, col="blue", cex=1.6, lwd=2) points(sx.x[sel.try], sx.y[sel.try], pch=4, col="green", cex=1.6, lwd=2) # anschl. kann man zaehlen, fuer welchen Bereich man ungefaehr wieviele Punkte # braucht -> sel.a <- round(seq(1,28,length=10),0) sel.b <- round(seq(35,115,length=3), 0) sel.c <- round(seq(120,155,length=6),0) sel.d <- round(seq(172,2000,length=50),0) sel <- c(sel.a, sel.b, sel.c, sel.d) # Aber wie gesagt, das ist halt perfektionistisch...