ggplot2: Passen Sie die Symbolgröße in Legenden an

71

Wie soll ich die Größe von Symbolen in Legenden ändern? Ich überprüfte das Dokument von theme, fand aber keine Antwort.

Hier ist ein Beispiel:

library(ggplot2);library(grid)
set.seed(1000)
x <- 1:6
mu <- sin(x)
observed <- mu + rnorm(length(x), 0, 0.5*sd(mu))
data <- data.frame(
  t=rep(x, 2), 
  value=c(mu, observed) - min(mu, observed) + 0.5, 
  class = rep(c("mu", "observed"), each=length(x)))
mu <- data$value[1:length(x)]
observed <- data$value[1:length(x) + length(x)]
mu.min <- mu - 3 * 0.5 * sd(mu)
mu.max <- mu + 3 * 0.5 * sd(mu)
g <- ggplot(data=data)
g <- g + geom_point(aes(x=value, y=t, shape=class, size=24)) + scale_size(guide="none")
g <- g + scale_shape(name="", labels=expression(paste(S[u](t), ", the observation at time ", t), paste(mu[u](t), ", the mean of ", tilde(S)[u](t), "          ")))
stat_function.color <- gray(0.5)
g <- g + geom_segment(aes(y=1:6, yend=1:6, x=mu.min, xend=mu.max, linetype="2", alpha = 1), color=stat_function.color) + scale_alpha(guide="none") + scale_linetype(name= "", labels=expression(paste("probability density function (pdf) of ", tilde(S)[u], " at time ", t)))
for(i in 1:length(x)) {
  g <- g + stat_function(fun=function(x, i) {
    ifelse( x <= mu.max[i] & x >= mu.min[i], dnorm(x, mu[i], sd(mu)) + i, NA)
    }, color=stat_function.color, args=list(i=i))
}
background.color <- gray(0.75)
g <- g + theme(
  axis.text=element_blank(),
  title=element_text(size=rel(1.5)),
  legend.text=element_text(size=rel(1.5)),
  legend.position="top",
  legend.direction="vertical",
#   legend.key.size = unit(2, "cm"),
  panel.background=element_rect(fill=background.color), 
  panel.grid.major=element_line(color=background.color),
  panel.grid.minor=element_line(color=background.color)
  ) + coord_flip()
plot(g)
wush978
quelle

Antworten:

82

Sie können diese Art von Änderungen manuell vornehmen, indem Sie das folgende override.aesArgument verwenden guide_legend():

g <- g + guides(shape = guide_legend(override.aes = list(size = 5)))
print(g)
Marius
quelle
@Ibo: bist du sicher? Ihr Beispielcode sieht so aus, als würde es funktionieren, wenn Sie eine Farbskala in der Legende hätten. Mein Beispiel war für eine Formskala, wie in der ursprünglichen Frage. AFAIK Dies funktioniert immer noch, wenn Sie eine Formskala haben, die Sie ändern. An dieser Stelle würde ich jedoch den Vorschlag von Duc_Hokie vorziehen, die Themenoptionen zu verwenden.
Marius
78

Du solltest benutzen:

theme(legend.key.size = unit(3,"line"))
Duc_Hokie2017
quelle
4
IMHO ist das die angemessenere Antwort, da es verwendet, themewas in der Frage erwähnt wurde.
Josef Eisl
36
Dieser Code vergrößert den Bereich um das Symbol, nicht das Symbol selbst. Der Leitfadencode ist besser geeignet.
LindsayLucas
Ich konnte es nicht für kleine Werte zum unit(0.1, "line")
Laufen bringen
2
Aber dies ist der Code, der tatsächlich das erreicht, was die meisten von uns wahrscheinlich auf dieser Seite versucht haben ...
Theforestecologist
Das hat bei mir funktioniert. Die akzeptierte Antwort hingegen nicht.
jdmartin86
36

Marius 'Antwort hat bei mir ab R Version 3.2.2 nicht funktioniert. Sie können weiterhin guide_legend()mit demselben override.easArgument aufrufen, müssen dies jedoch coloranstelle shapeder Wrapper-Funktion angeben .

Wenn Sie also eine spätere Version von R ausführen, versuchen Sie stattdessen Folgendes:

g + guides(color = guide_legend(override.aes = list(size=5)))

BEARBEITEN

Wie von @Ibo im Kommentar hervorgehoben, kann dies an der Farbskala im ggplotObjekt liegen. Wenn das ggplotObjekt eine Farbskala enthält, size=5muss stattdessen die Zuordnung von size ( ) auf die Farbe festgelegt werden.

einziges Phantom
quelle
6
Ich denke, der Grund, warum es bei Ihnen nicht funktioniert hat, war, dass Sie eine Farbskala in Ihrem Plot hatten und keine Formskala. Marius 'Antwort ändert die Größe der Formen in einer Legende für Form. Ihre Codezeile ändert die Größe der Form der Legende für eine Farbskala
Ibo
8

Wenn Sie die Größe von 2 Komponenten einer Legende unabhängig voneinander ändern möchten, wird dies schwieriger. Sie können dies jedoch tun, indem Sie die einzelnen Komponenten des Diagramms mithilfe des gridPakets manuell bearbeiten .

Beispiel basierend auf dieser SO-Antwort :

set.seed(1)
dat <- data.frame(x = runif(n = 100),
                  x2 = factor(rep(c('first', 'second'), each = 50)))
set.seed(1)
dat$y = 5 + 1.8 * as.numeric(dat$x2) + .3 * dat$x + rnorm(100)

# basic plot
g <- ggplot(data = dat,
       aes(x = x, y = y, color = x2))+
   theme_bw()+
   geom_point()+
   geom_smooth(method = 'lm')

Geben Sie hier die Bildbeschreibung ein

# make the size of the points & lines in the legend larger
g + guides(color = guide_legend(override.aes = list(size = 2)))

Geben Sie hier die Bildbeschreibung ein

# Make JUST the legend points larger without changing the size of the legend lines:
# To get a list of the names of all the grobs in the ggplot
g
grid::grid.ls(grid::grid.force())

# Set the size of the point in the legend to 2 mm
grid::grid.gedit("key-[-0-9]-1-1", size = unit(4, "mm"))

# save the modified plot to an object
g2 <- grid::grid.grab()
ggsave(g2, filename = 'g2.png')

Geben Sie hier die Bildbeschreibung ein

filups21
quelle