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)

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
Ich bearbeite meine ursprüngliche Antwort, hoffentlich ist das was du suchst. – advek88
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