2017-12-15 4 views
0

R Pakete: cowplot/ggplot2Cowplot: Wie fügt man einem marginalen Plot Tick-Markierungen und entsprechende Datenbeschriftungen hinzu?

Use Case: Streudiagramm mit marginalen Histogramme.

Problem: Für Histogramme, kann ich nicht hinzufügen, Klassengröße oder Referenz unteren/oberen Klassenintervalle in der x-Achse. Ohne diese Histogramme sind schwer zu lesen.

In Cowplot, gibt es eine Möglichkeit, Tickmarkierungen und entsprechende Daten Etiketten (in x-Achse) zu marginalen Plots hinzuzufügen, wenn erforderlich? Z.B. für Histogramme in Rand Plots

Grundstreuung + Rand Histogramm Plot cowplot

require(ggplot2) 
require(cowplot) 

Haupt Grundstück mit:

pmain <- ggplot(data = mpg, aes(x = cty, y = hwy)) + 
    geom_point() + 
    xlab("City driving") + 
    ylab("Highway driving") + 
    theme_grey() 

Marginal Grundstück:

xbox <- axis_canvas(pmain, axis = "x") + 
    geom_histogram(
    data = mpg, 
    aes(x = cty), 
    colour = "black" 
) 

Kombinierter Grundstück:

p1 <- insert_xaxis_grob(pmain, xbox, grid::unit(0.5, "in"), position = "top") 

ggdraw(p1) 

Output-1

Allerdings würde ich die folgende Handlung wollen xbox2 als x-Achse Randstück angezeigt werden:

xbox2.1 <- ggplot() + 
    geom_histogram(
    data = mpg, 
    aes(x = cty), 
    colour = "black" 
) 
hist_tab <- ggplot_build(xbox2.1)$data[[1]] 

xbox2 <- xbox2.1 + 
    scale_x_continuous(
    breaks = c(round(hist_tab$xmin,1), 
       round(hist_tab$xmax[length(hist_tab$xmax)],1)) 
) + 
    labs(x = NULL, y = NULL) + 
    theme(
    axis.text.x = element_text(angle = 90, size=7,vjust=0.5), 
    axis.line = element_blank(), 
    axis.text.y=element_blank(), 
    axis.ticks.y=element_blank() 
) 

xbox2 

Output-2

Aber ich kann nicht erstellen ein Scatter + Marginal-Histogramm (xbox2). Ich bekomme die gleiche Handlung wie die erste:

p2 <- insert_xaxis_grob(pmain, xbox2, grid::unit(0.5, "in"), position = "top") 
ggdraw(p2) 

Output-3

+0

Ich wähle diese Frage erneut zu öffnen. Das OP hat es bearbeitet und es enthält nun ein minimales, vollständiges und überprüfbares Beispiel. –

Antwort

2

Package Autor hier. Was Sie sehen, ist das dokumentierte Verhalten. Aus der Dokumentation des grob Arguments :

Die Grob einfügen. Dies wird in der Regel über get_panel() aus einem ggplot2 Objekt, insbesondere einem mit axis_canvas() generierten, erhalten. Wenn ein ggplot2 Plot anstelle eines grob vorgesehen ist, dann wird get_panel() aufgerufen, um den Panel Grob zu extrahieren.

Diese Funktion ist speziell nicht zum Stapeln von Plots vorgesehen. Sie könnten Ihre gesamte Handlung in einen Grob verwandeln und dann mit dieser Funktion einfügen, aber ich bin mir nicht sicher, ob das sehr sinnvoll ist. Was Sie zu tun versuchen, entspricht dem Stapeln von zwei Plots mit demselben X-Achsen-Bereich. Ich denke, es ist besser, es einfach so zu codieren.

library(cowplot) 

xlimits <- c(6, 38) 

pmain <- ggplot(data = mpg, aes(x = cty, y = hwy)) + 
    geom_point() + 
    xlab("City driving") + 
    ylab("Highway driving") + 
    scale_x_continuous(limits = xlimits, expand = c(0, 0)) + 
    theme_grey() + 
    theme(plot.margin = margin(0, 5.5, 5.5, 5.5)) 


xhist <- ggplot() + 
    geom_histogram(
    data = mpg, 
    aes(x = cty), 
    colour = "black", 
    binwidth = 1, 
    center = 10 
) + 
    scale_x_continuous(limits = xlimits, expand = c(0, 0), breaks = 8:35) + 
    labs(x = NULL, y = NULL) + 
    theme(
    axis.text.x = element_text(angle = 90, size=7, vjust=0.5), 
    axis.line = element_blank(), 
    axis.text.y = element_blank(), 
    axis.ticks.y = element_blank(), 
    plot.margin = margin(5.5, 5.5, 0, 5.5) 
) 

plot_grid(xhist, pmain, ncol = 1, align = "v", rel_heights = c(0.2, 1)) 

enter image description here

Verwandte Themen