2016-07-27 5 views
1

Ich bin neu hier, also bitte, wenn ich es vergessen habe, verzeih mir. Ich versuche, wie das Bild unten zu bekommen. Aber ich kämpfe in zwei Punkten: Meine Linien beginnen nicht direkt von der y-Achse und ich will unter dem Maß der x-Achse und der Beschriftung der x-Achse zwei Beschriftungen als Legende zum vline. Ich habe versucht, es mit annotation_custom zu bekommen, aber das hat es in das Plot selbst gestellt, aber ich will es auf der x-Achse oder am Anfang des Plots, ohne auf dem Graph selbst geschrieben zu sein.Zusätzliche Etiketten auf der X-Achse als Legende eines Trenners

Bisher habe ich den folgenden Code:

require(reshape) 
library(ggplot2) 

user <- gl(3, 1) 
Meas1 <- c(0.7, 0.3, 0.3) 
Meas2 <- c(0.7, 0.3, 0.3) 
Meas3 <- c(0.2, 0.4, 0.4) 
group <- c(3, 2, 2) 
df <- data.frame(user=user, Meas1=Meas1, Meas2=Meas2, Meas3=Meas3, group=group) 

dfm <- melt(df, id.vars=c("user", "group")) 
flevels=as.vector.factor(unique(dfm$variable)) 

ggplot(dfm, aes(x=factor(variable), y=value, colour=user, group=user)) + 
    geom_line() + 
    scale_x_discrete(breaks=flevels, labels=flevels) 

Dies ist, wie ich es haben möchte (die Etiketten sind class1 und class2)

enter image description here

würde ich wirklich appriciate Ihre Hilfe.

Antwort

0

Um die Linien direkt auf der y-Achse starten Sie die erweitern Paramater auf die scale_x_discrete Funktion, wie setzen müssen:

scale_x_discrete(breaks=flevels, labels=flevels, expand = c(0,0)) 

Sie hinzufügen können, eine Legende wie:

theme(legend.position = 'bottom') 

Die Ergebnis sind drei Beschriftungen, solange Sie drei Benutzer mit Ihren Daten mit denselben Werten haben. Ich denke, das Subsetting Ihrer Daten durch Eliminierung von Benutzer 2 ist der einfachste Weg, um zwei Labels zu erhalten.

+0

Danke advek, die bereits sehr geholfen. Das wusste ich nicht. Haben Sie auch eine Idee, wie Sie die Etiketten zum Separator bekommen können? – Momina

+0

Ich bearbeite meine ursprüngliche Antwort, hoffentlich ist das was du suchst. – advek88

+0

Ich möchte meine Legende nicht verschieben. Es ist wie auf dem Bild meiner Frage. Zwischen den X-Achsen-Labels (Meas1, Meas2, Meas3) und dem X-Label (Faktor (Variable)) gibt es zwei Labels. Ich möchte das so, damit Sie wissen, auf der linken Seite der Vline haben Sie Klasse 1 und auf der rechten Seite class2 – Momina

0

Einige Möglichkeiten fallen mir ein. Ich präsentiere drei unten. In allen dreien positioniere ich die "Class 1" - und "Class 2" -Etiketten oben auf dem Diagramm. Aber ich bin nicht sicher, wie oder wo Sie die Abgrenzung zwischen "Klasse 1" und "Klasse 2" positionieren möchten. Ich positionierte es etwas mehr als auf halbem Weg über das Diagramm.

Die erste ist die einfachste. Es positioniert die Etiketten mit annotate. Soweit ich weiß, gibt es keine einfache Möglichkeit, ein kurzes Liniensegment zur Abgrenzung der beiden Regionen zu bekommen. Hier zeichne ich eine Linie über das Diagramm, aber weil es das Diagrammfeld durchquert, denke ich, dass es eine Ablenkung ist.

Die zweite erstellt ein Grob, das die zwei Labels und ein kurzes Liniensegment enthält, und positioniert dann den Grob mit annotation_custom. Der dritte erzeugt auch einen Grob (obwohl die Grob-Konstruktion etwas einfacher ist), positioniert dann den Grob unter Verwendung von Funktionen aus der gtable-Packung.

Weitere Kommentare unten.

# Your data 
require(reshape) 

user <- gl(3, 1) 
Meas1 <- c(0.7, 0.3, 0.3) 
Meas2 <- c(0.7, 0.3, 0.3) 
Meas3 <- c(0.2, 0.4, 0.4) 
group <- c(3, 2, 2) 
df <- data.frame(user=user, Meas1=Meas1, Meas2=Meas2, Meas3=Meas3, group=group) 

dfm <- melt(df, id.vars = c("user", "group")) 
flevels = as.vector.factor(unique(dfm$variable)) 

Erste Methode: annotate

Die Etiketten an der Oberseite des Plots Platte positioniert sind, verwendet dann den Text vjust außerhalb der Zeichnungstafel zu bewegen. Der obere Plot-Rand wird erweitert, um Platz für die Beschriftungen zu schaffen. Da Text außerhalb des Plotbereichs geplottet wird, muss das Clipping auf dem Plotpanel deaktiviert werden.

library(ggplot2) 
library(grid) 

# The plot 
p = ggplot(dfm, aes(x = factor(variable), y = value, colour = user, group = user)) + 
    geom_line() + 
    scale_x_discrete(breaks = flevels, labels = flevels) + 
    theme(plot.margin = unit(c(1.5, .1, .1, .1), "lines")) 

# plus the annotations 
p = p + annotate("text", x = c(1.35, 2.85), y = Inf, label = c("Class 1", "Class 2"), vjust = -.75) + 
     annotate("segment", x = 2.2, xend = 2.2, y = -Inf, yend = Inf) 

# Turn off clipping 
gp = ggplotGrob(p) 
gp$layout[gp$layout$name == "panel", "clip"] = "off" 

# Draw the plot 
grid.newpage() 
grid.draw(gp) 

Zweite Methode: annotation_custom

Es gibt ein paar Möglichkeiten, um die Elemente zu positionieren.Hier mache ich die Positionierung im Grobbau, dann kann die annotation_custom für -Inf bis Inf überspannen. Es gab ein bisschen Trial-and-Error, um die y-Koordinaten richtig zu bekommen. Da der Grob auch außerhalb des Plot-Bedienfelds geplottet wird, muss der obere Plot-Rand erweitert und das Clipping auf dem Panel muss ausgeschaltet werden.

xpos = .6 # of the demarcation between the two labels; in npc units 

# Construct the grob 
lab1 = textGrob("Class 1", x = .5 * xpos, y = 1.02) 
lab2 = textGrob("Class 2", x = .5 + .5 * xpos, y = 1.02) 
seg = linesGrob(x = c(xpos, xpos), y = c(1, 1.04)) 

labs = gTree(children = gList(lab1, lab2, seg)) 

p = ggplot(dfm, aes(x = factor(variable), y = value, colour = user, group = user)) + 
    geom_line() + 
    scale_x_discrete(breaks = flevels, labels = flevels) + 
    theme(plot.margin = unit(c(1.5, .1, .1, .1), "lines")) + 

    annotation_custom(labs, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) 

gp = ggplotGrob(p) 
gp$layout[gp$layout$name == "panel", "clip"] = "off" 

grid.newpage() 
grid.draw(gp) 

Drittes Verfahren: gtable Funktionen

GROB aufgebaut ist, aber es gibt brauchen etwa y-Koordinaten zu sorgen. Die gtable Funktionen fügen eine Zeile an den Anfang der gtable (d. H. Das Diagramm) und fügen dann den Grob in diese Zeile ein. t und l beziehen sich auf Zeilen und Spalten im gtable-Layout. gtable_show_layout(gp) zeigt das Layout an. Siehe auch gtable Hilfeseiten (?gtable_add_rows und ?gtable_add_grob)

library(gtable) 

xpos = .6 # in npc units 
lab1 = textGrob("Class 1", x = .5 * xpos) 
lab2 = textGrob("Class 2", x = .5 + .5 * xpos) 
seg = linesGrob(x = c(xpos, xpos)) 

labs = gTree(children = gList(lab1, lab2, seg)) 

p = ggplot(dfm, aes(x = factor(variable), y = value, colour = user, group = user)) + 
    geom_line() + 
    scale_x_discrete(breaks = flevels, labels = flevels) 

gp = ggplotGrob(p) 

row = 2 
gp = gtable_add_rows(gp, unit(2, "grobheight", lab1), row) 

l = gp$layout[grepl("panel", gp$layout$name), ]$l 
gp = gtable_add_grob(gp, labs, t = row + 1, l = l) 

grid.newpage() 
grid.draw(gp) 

enter image description here

Verwandte Themen