Kontrollpunktranddicke im ggplot

76

Wenn ich ggplot verwende, kann ich shape21-25 einstellen , um Formen zu erhalten, die eine unabhängige Einstellung für die Farben intern ( fill) und border ( col) haben, wie folgt:

df <- data.frame(id=runif(12), x=1:12, y=runif(12))
ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(fill=id, size=id), colour="black", shape=21)

Geben Sie hier die Bildbeschreibung ein

Ich kann jedoch nicht herausfinden, wie die Dicke der Formränder gesteuert werden kann, entweder absolut oder als ästhetische Abbildung. Ich stelle fest, dass wenn ich einen lwdWert setze, dies die sizeÄsthetik überschreibt :

ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(fill=id, size=id), colour="black", shape=21, lwd=2)

Geben Sie hier die Bildbeschreibung ein

Wie steuere ich die Randdicke?

Noam Ross
quelle

Antworten:

102

Ab Version 2.0.0 von ggplot2 gibt es ein Argument zur Steuerung der Punktranddicke . Aus der NEWS.mdDatei:

geom_point () erhält eine Strichästhetik, die die Randbreite der Formen 21-25 (# 1133, @SeySayux) steuert. Größe und Hub addieren sich, sodass ein Punkt mit Größe = 5 und Hub = 5 einen Durchmesser von 10 mm hat. (# 1142)

Die richtige Lösung hierfür lautet nun:

df <- data.frame(id=runif(12), x=1:12, y=runif(12))
ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(fill=id, size=id), colour="black", shape=21, stroke = 2)

Ausgabe

Noam Ross
quelle
1
Können Sie die Ausgabe hinzufügen?
Thomas
3
Aus Gründen der zukünftigen Kompatibilität und Klarheit wäre es schön, "Ab Version x.xx" und nicht "die neueste Version" zu sagen.
Gregor Thomas
Gibt es eine Möglichkeit, die Dicke des Strichs anhand der Variablen zu steuern? Etwas in der Art von "scale_stroke_manual"?
Ricecakes
2
Als Antwort auf meinen eigenen Kommentar oben können wir scale_discrete_manual verwenden. Siehe Link hier: github.com/tidyverse/ggplot2/issues/3507#issuecomment-526212978
Ricecakes
17

Es fühlt sich ein bisschen hackig an, aber Sie können einen " Hintergrund " -Punktsatz mit der Größe hinzufügen, die für die ästhetische Zuordnung festgelegt wurde, sowie eine kleine Konstante, um den Rand der Punkte zu vergrößern . Spielen Sie mit der Konstante, um die gewünschte Randbreite zu erhalten.

Sie müssen auch die Größenlegende deaktivieren, um zu verhindern, dass die Legende in der Grafik angezeigt wird ...

ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(size=id+0.5), colour="black" , show_guide = FALSE )+
  scale_size( guide = "none" )+
  geom_point(aes(fill=id, size=id), colour="black", shape=21)

Geben Sie hier die Bildbeschreibung ein

Simon O'Hanlon
quelle
2
Vielleicht Hackey, aber Hadley hat diese Methode auf Twitter gebilligt
Noam Ross
1
@NoamRoss hast du den Link dafür?
Simon O'Hanlon
2

Eine andere Lösung besteht darin, das Diagramm in R zu erstellen und es dann in eine SVG-Datei zu exportieren. Die Linienbreite kann dann mit einer Vektorgrafik-Bearbeitungssoftware (z. B. Inkscape) geändert werden. Diese Methode ist besonders nützlich, wenn sich Datenpunkte überlappen.

Gopal Penny
quelle