2016-06-29 9 views
3

Ich möchte das Directlabels Paket mit ggplot erkunden. Ich versuche, Beschriftungen am Endpunkt eines einfachen Liniendiagramms zu zeichnen. Die Beschriftungen werden jedoch vom Plotpanel abgeschnitten.Directlabels Paket in R - Etiketten passen nicht in den Plotbereich

Ich könnte mir vorstellen, es könnte eine andere Lösung mit annotate oder einige andere geoms sein. Aber ich würde gerne mit directlabels lösen. Bitte siehe Code und Bild unten. Vielen Dank.

library(ggplot2) 
library(directlabels) 
library(tidyr) 

#generate data frame with random data, for illustration and plot: 
x <- seq(1:100) 
y <- cumsum(rnorm(n = 100, mean = 6, sd = 15)) 
y2 <- cumsum(rnorm(n = 100, mean = 2, sd = 4)) 
data <- as.data.frame(cbind(x, y, y2)) 
names(data) <- c("month", "stocks", "bonds") 
tidy_data <- gather(data, month) 
names(tidy_data) <- c("month", "asset", "value") 
p <- ggplot(tidy_data, aes(x = month, y = value, colour = asset)) + 
geom_line() + 
geom_dl(aes(colour = asset, label = asset), method = "last.points") + 
theme_bw() 

line chart with end labels

Dank Nick (für die Antwort unten). Ihre Lösung mit xlim funktioniert.

Allerdings denke ich es auf Daten Visualisierung Prinzip Ich möchte vermeiden, die X-Achse zu erweitern, um die Etiketten passen - das würde bedeuten, Datenraum ohne Daten. Stattdessen möchte ich, dass sich die Beschriftungen in Richtung des Leerraums über die Diagrammbox hinaus erstrecken (wenn das sinnvoll ist).

Für zusätzlichen Kontext, ich beabsichtige, eine etwa 10 finanzielle Zeitreihe in einem Plot zu plotten, und ich dachte, Directlabels wäre die beste Lösung, nein?

Antwort

4

Meiner Meinung nach, direkte Etiketten ist der Weg zu gehen. In der Tat, ich würde Etiketten am Anfang und am Ende der Zeilen positionieren und Platz für die Etiketten mit expand() schaffen. Beachten Sie auch, dass bei den Beschriftungen die Legende nicht benötigt wird.

Dies ist ähnlich wie die Antworten here und here.

library(ggplot2) 
library(directlabels) 
library(grid) 
library(tidyr) 

x <- seq(1:100) 
y <- cumsum(rnorm(n = 100, mean = 6, sd = 15)) 
y2 <- cumsum(rnorm(n = 100, mean = 2, sd = 4)) 
data <- as.data.frame(cbind(x, y, y2)) 
names(data) <- c("month", "stocks", "bonds") 
tidy_data <- gather(data, month) 
names(tidy_data) <- c("month", "asset", "value") 

ggplot(tidy_data, aes(x = month, y = value, colour = asset, group = asset)) + 
    geom_line() + 
    scale_colour_discrete(guide = 'none') + 
    scale_x_continuous(expand = c(0.15, 0)) + 
    geom_dl(aes(label = asset), method = list(dl.trans(x = x + .3), "last.bumpup")) + 
    geom_dl(aes(label = asset), method = list(dl.trans(x = x - .3), "first.bumpup")) + 
    theme_bw() 

enter image description here

Wenn Sie es vorziehen, die Etiketten in den Plot-Marge, direkte Markierungen wird das tun zu schieben. Da sich die Beschriftungen jedoch außerhalb des Plot-Bedienfelds befinden, muss die Übersteuerung deaktiviert werden.

p1 <- ggplot(tidy_data, aes(x = month, y = value, colour = asset, group = asset)) + 
    geom_line() + 
    scale_colour_discrete(guide = 'none') + 
    scale_x_continuous(expand = c(0, 0)) + 
    geom_dl(aes(label = asset), method = list(dl.trans(x = x + .3), "last.bumpup")) + 
    theme_bw() + 
    theme(plot.margin = unit(c(1,4,1,1), "lines")) 

# Code to turn off clipping 
gt1 <- ggplotGrob(p1) 
gt1$layout$clip[gt1$layout$name == "panel"] <- "off" 
grid.draw(gt1) 

enter image description here

Dieser Effekt auch geom_text (und wahrscheinlich auch annotate) erreicht werden kann, verwendet wird, das heißt, ohne die Notwendigkeit für eine direkte Etiketten.

p2 = ggplot(tidy_data, aes(x = month, y = value, group = asset, colour = asset)) + 
    geom_line() + 
    geom_text(data = subset(tidy_data, month == 100), 
     aes(label = asset, colour = asset, x = Inf, y = value), hjust = -.2) + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_colour_discrete(guide = 'none') + 
    theme_bw() + 
    theme(plot.margin = unit(c(1,3,1,1), "lines")) 

# Code to turn off clipping 
gt2 <- ggplotGrob(p2) 
gt2$layout$clip[gt2$layout$name == "panel"] <- "off" 
grid.draw(gt2) 

enter image description here

+0

Große Antwort. Dies sind die besten Lösungen. –

2

Da Sie kein reproduzierbares Beispiel angegeben haben, ist es schwer zu sagen, was die beste Lösung ist. Ich würde jedoch vorschlagen, dass Sie versuchen, die X-Skala manuell anzupassen. Verwenden Sie einen "Puffer", um den Diagrammbereich zu vergrößern.

#generate data frame with random data, for illustration and plot: 
p <- ggplot(tidy_data, aes(x = month, y = value, colour = asset)) + 
geom_line() + 
geom_dl(aes(colour = asset, label = asset), method = "last.points") + 
theme_bw() + 
xlim(minimum_value, maximum_value + buffer) 

Mit scale_x_discrete() oder scale_x_continuous() würde auch gut hier wahrscheinlich funktionieren, wenn Sie die direkte Etiketten-Paket verwenden möchten. Alternativ könnte auch kommentieren oder ein einfacher geom_text gut funktionieren.

+0

Dank Nick. Deine Lösung mit 'xlim' funktioniert. Ich denke jedoch, dass es beim Prinzip der Datenvisualisierung vermieden werden sollte, die X-Achse zu erweitern, um die Beschriftungen anzupassen. Stattdessen möchte ich, dass sich die Beschriftungen in Richtung des Leerraumes über das Diagrammfeld hinaus erstrecken (wenn das sinnvoll ist). –

+0

BTW, ich habe die ursprüngliche Frage bearbeitet, um den Kontext zu erklären und Code hinzuzufügen. –

+0

@JuanMier Ich stimme überhaupt nicht zu. Leider weiß ich nicht, wie ich das erreichen soll, was du beschreibst.Ich weiß, dass du gesagt hast, du möchtest Directlabels verwenden, aber ich denke, dass die Verwendung von Anmerkungen und die Positionierung der Labels eine anständige Lösung sein würde. –