2017-12-15 3 views
1

Also, wie in der Überschrift gesagt, möchte ich meiner Heatmap eine weitere visuelle Ebene hinzufügen. InputHinzufügen der Barplot-Ebene zur Heatmap (geom_tile)

Beispieldaten stammen von mpg.

library(tidyverse) # for dplyr and ggplot2 

data <- mpg %>% 
    mutate(quantity = 1, isnew = ifelse(year == 2008, 1, 0)) %>% 
    group_by(drv, class) %>% 
    summarise(quantity = sum(quantity), isnew = round(sum(isnew)/quantity, 2)) 

Zwei Kategorien als Hauptachse - Klasse und drv. Menge ist nur eine Anzahl von Autos für jede Kreuzung von Klasse und drv. Isnew ist ein Anteil von Neuwagen (Jahr 2008 vs 1999) in Menge.

 drv  class quantity isnew 
    <chr>  <chr> <dbl> <dbl> 
1  4 compact  12 0.67 
2  4 midsize  3 0.67 
3  4  pickup  33 0.52 
4  4 subcompact  4 0.00 
5  4  suv  51 0.53 
6  f compact  35 0.40 
7  f midsize  38 0.50 
8  f minivan  11 0.45 
9  f subcompact  22 0.50 
10  r 2seater  5 0.60 
11  r subcompact  9 0.56 
12  r  suv  11 0.55 

Heatmap

ggplot(data, aes(class, drv)) + 
    geom_tile(aes(fill = quantity)) + 
    geom_text(aes(label = isnew)) 

Was ich möchte, ist zu erreichen, Textwerte auf jedem Abschnitt zu gestapelte Balken zu ändern. Der obere Teil jedes Balkens muss transparent sein, um die ursprünglichen Farben der Heatmap zu speichern. Der untere Wert muss den isnew Wert dieses Sektors der Heatmap darstellen.

Zeichnen Sie einen Teil (nur paar Bars, aber ich will sie alle) der gewünschten Ausgabe in Paint 8p

Output

gefunden in here, dass es wahrscheinlich über ggsubpolot Paket erfolgen. Aber es scheint deprecated, und "Embed in ggplot2 Grafiken" wie bei Grolemund Github angegeben.

Antwort

1

Diese Handlung scheint mir ziemlich verwirrend, aber ich konnte nicht widerstehen, einen Riss zu machen. Wir verwenden geom_segment, um die Balken zu erstellen, und verwenden die zugrunde liegenden drv Faktorcodierungen, um die Balken und Textbeschriftungen an den richtigen Stellen auf der y-Achse zu platzieren.

ggplot(data, aes(class, drv)) + 
    geom_tile(aes(fill = quantity), colour="white", size=0.5) + 
    geom_segment(aes(y=as.numeric(as.factor(drv)) - 0.5, 
        yend=as.numeric(as.factor(drv)) - 0.5 + isnew, 
        x=class, xend=class), 
       colour="yellow", size=10) + 
    geom_text(aes(label = isnew, y=(2*as.numeric(as.factor(drv)) + isnew)/2 - 0.5), 
      colour="grey30", size=3) + 
    theme_classic() 

enter image description here

mit vielleicht geom_point mit einer Größe Ästhetik wäre besser:

ggplot(data, aes(class, drv)) + 
    geom_tile(aes(fill = quantity), colour="white", size=0.5) + 
    geom_point(aes(size=isnew), shape=21, fill="white") + 
    scale_size_continuous(range=c(1,10)) + 
    theme_classic() 

enter image description here

Verwandte Themen