Steuern Sie die Größe von Punkten in einem R-Streudiagramm?

116

In R verwendet die plot()Funktion ein pchArgument, das das Erscheinungsbild der Punkte im Diagramm steuert. Ich mache Streudiagramme mit Zehntausenden von Punkten und bevorzuge einen kleinen, aber nicht zu kleinen Punkt. Grundsätzlich finde pch='.'ich zu klein, aber pch=19zu fett. Gibt es etwas in der Mitte oder eine Möglichkeit, die Punkte irgendwie zu verkleinern?

Nick
quelle
Gibt es eine Möglichkeit, anstatt Punkte kleiner zu machen, einfach zu zeichnen, dass 100 zufällige Datenpunkte leichter zu sehen wären als 1000?
user2363642
Bei vielen kleinen Punkten kann die Verwendung von Alpha (Transparenz) ein Streudiagramm viel informativer machen als die Verwendung von weniger Punkten zum Zeichnen.
1
Ich schlage vor, nicht zu verwenden pch='.', es wird außermittig sein. Quelle: Ich habe pch='.'oft verwendet
Genorama
@geneorama Meinst du mit ·statt .?
Nanaki
@nanaki mehr oder weniger, aber seltsamerweise wird Ihr Symbol als winziges Kästchen angezeigt, wenn ich es in R verwende. Die folgenden Antworten sind gut darin, den richtigen Ansatz zu erklären.
Genorama

Antworten:

100

Versuchen Sie das cexArgument:

?par

  • cex
    Ein numerischer Wert, der den Betrag angibt, um den das Zeichnen von Text und Symbolen relativ zum Standardwert vergrößert werden soll. Beachten Sie, dass einige Grafikfunktionen wie plot.default ein Argument dieses Namens haben, das diesen grafischen Parameter multipliziert, und einige Funktionen wie Punkte einen Vektor von Werten akzeptieren, die wiederverwendet werden. Andere Verwendungen nehmen nur den ersten Wert an, wenn ein Vektor mit einer Länge größer als eins angegeben wird.
rcs
quelle
15
Ich glaube nicht, dass ich jemals 'cex' verwenden würde, um die Symbolgröße zu steuern, es sei denn, ich hätte keine andere Option. Es funktioniert nur manchmal; Die Regel lautet: Wenn 'cex' über 'par' festgelegt wird, wirkt sich dies auf die Größe des (meisten) Texts im Plot aus. Wenn Sie in 'plot' festlegen, wirkt sich 'cex' nur auf die Symbolgröße aus. Wenn Sie diese Regel falsch anwenden, wird nicht nur Ihre Symbolgröße nicht geändert, sondern Sie haben jetzt mehrere Parameter, die sich auf die Textgröße auswirken (cex.axis, cex.lab, cex.main und cex.sub - alle tun dasselbe Job als 'cex', nur stückweise). Code wie dieser ist schwer zu pflegen und zu erweitern.
Doug
5
Zustimmen. Durch globales Einstellen cexüber parÄnderungen werden alle möglichen Dinge geändert, einschließlich der Bildränder, die Sie korrigieren müssen. Einstellung cexinnerhalb plotscheint jedoch zu funktionieren.
fliegt
Der oben in Dougs Kommentar vertretene Rat ist nicht unbedingt falsch , überbewertet jedoch potenzielle Probleme bei der Verwendung des cexArguments beim Plotten erheblich . Es gibt viele, viele Fälle, in denen dies sowohl nützlich als auch die beste Option ist.
Joran
lwdsteuert die Linienbreite des pch, z plot(1:5, pch=1:5, col=1:5, lwd=1:5). Vielen Dank an sthda.com/english/wiki/…
geneorama
95

pch = 20 gibt ein Symbol mit einer Größe zwischen "." zurück. und 19.

Es ist ein gefülltes Symbol (was wahrscheinlich das ist, was Sie wollen).

Abgesehen davon ermöglicht sogar das Basisgrafiksystem in R einem Benutzer eine fein abgestimmte Kontrolle über Symbolgröße, -farbe und -form. Z.B,

dfx = data.frame(ev1=1:10, ev2=sample(10:99, 10), ev3=10:1)

with(dfx, symbols(x=ev1, y=ev2, circles=ev3, inches=1/3,
                  ann=F, bg="steelblue2", fg=NULL))

Diagrammbeispiel

Doug
quelle
Ich liebe diese Handlung, aber ich möchte, dass der Radius der Anzahl der Beobachtungen zu diesem Punkt entspricht. Können Sie mir zeigen, wie das geht?
Derk Arts
pi*R^2(die Oberfläche) sollte proportional zur Anzahl der Beobachtungen sein.
SESman
5
@saratis Dies wird tun, was Sie wollen:symbols(x=dfx$ev1, y=dfx$ev2, circles=sqrt(dfx$ev3/pi), inches=1/3, ann=F, bg="steelblue2", fg=NULL)
fmark
1
Haben Sie eine Idee, wie ich damit mehrere Serien in demselben Diagramm darstellen könnte? dh "Punkte (x = dfx2 $ ev1, y = dfx2 $ ev2, Kreise = dfx2 $ ev3, ...)" funktioniert nicht.
Neodyme
Für den Fall, dass Sie sich fragen: "Was ist ein Zoll?" siehe hier
MichaelChirico
22

Wie von rcs angegeben, cexwird die Arbeit im Basis-Grafikpaket erledigt . Ich gehe davon aus, dass Sie nicht bereit sind, Ihr Diagramm zu erstellen, ggplot2aber wenn Sie dies tun, gibt es ein sizeästhetisches Attribut, das Sie leicht steuern können ( ggplot2mit benutzerfreundlichen Funktionsargumenten: Anstatt zu tippen cex(Zeichenerweiterung), ggplot2können Sie zB size = 2und eingeben Sie erhalten 2mm Punkt).

Hier ist das Beispiel:

### base graphics ###
plot(mpg ~ hp, data = mtcars, pch = 16, cex = .9)

### ggplot2 ###
# with qplot()
qplot(mpg, hp, data = mtcars, size = I(2))
# or with ggplot() + geom_point()
ggplot(mtcars, aes(mpg, hp), size = 2) + geom_point()
# or another solution:
ggplot(mtcars, aes(mpg, hp)) + geom_point(size = 2)
aL3xa
quelle
4
Und wenn Sie wirklich Zehntausende von Punkten zeichnen, bietet ggplot2 verschiedene alternative Möglichkeiten, um dies gut aussehen zu lassen - Alpha-Anpassungen, Hex-Bins, Konturdiagramme usw. Lesen Sie die Seiten 72-77 des ggplot2-Buches, falls vorhanden in Ihrer Bibliothek oder wenn Ihre Bibliothek elektronischen Zugang zu Springer-Büchern hat (ich denke, die meisten R-Bücher sind dort).
Matt Parker
Yup ... Ich verwende es besonders alphain Streudiagrammen, um ein Überzeichnen zu vermeiden.
aL3xa
@ aL3xa Sie können Alpha im Basisgrafikpaket verwenden . Fügen Sie zum Beispiel einfach col = rgb(0, 0, 0, 0.6)Plotoptionen hinzu.
RobJan