2017-10-16 2 views
0

gefärbt wird Ich habe Daten, die ich ggplot mit einem Farbverlauffarbschema mögen möchte und dann einige der Punkte annotieren.Fügen Sie eine geom_text_repel Schicht zu geom_point hinzu, die durch scale_colour_gradient2

Meine Daten:

df <- data.frame(id = rep(LETTERS,100), 
       val1 = rnorm(100*length(LETTERS)), val2 = rnorm(100*length(LETTERS)), 
       sig = runif(100*length(LETTERS),0,1), 
       col = NA,stringsAsFactors = F) 

Hier wähle ich ein paar Punkte, die ich möchte sie Farben mit Anmerkungen versehen und geben:

df$col[sample(nrow(df), 10, replace = F)] <- rainbow(10) 

Und hier ist der ggplot Code Ich versuche:

library(ggplot2) 
library(ggrepel) 
ggplot(df,aes(x=val1,y=val2,color=col))+ 
    geom_point(aes(color=sig),cex=2)+scale_colour_gradient2("Significance",low="darkred",mid="darkblue",high="darkred")+ 
    geom_text_repel(data=dplyr::filter(df,!is.na(col)),aes(x=dplyr::filter(df,!is.na(col))$val1,y=dplyr::filter(df,!is.na(col))$val2,label=dplyr::filter(df,!is.na(col))$id,colour=dplyr::filter(df,!is.na(col))$col))+ 
    theme_minimal()+theme(legend.position="none") 

, die diesen Fehler auslöst:

Error: Discrete value supplied to continuous scale 

Irgendeine Idee?

Antwort

3

Grundsätzlich gibt es zwei Ansätze. Einer besteht darin, die kontinuierliche Variable, die gefüllt werden soll, und die diskrete Textvariable innerhalb des AES-Aufrufs farbig darzustellen. Und die andere besteht darin, die kontinuierliche Variable so abzubilden, dass sie in aes farbig wird und den Text außerhalb eines Aufrufs manuell mappt.

1. Ansatz - Kartieren kontinuierliche Skala zu füllen, und mit einer Form (pch = 21), die Füllung Ästhetik unterstützt. Ich habe scale_fill_gradientn verwendet und manuell definiert, wo die Farben im Datenbereich liegen sollten - values = scales::rescale(c(min(df$sig), median(df$sig), max(df$sig))).

Danach ist es einfach, die diskrete Skala (Etiketten abstoßen) der Farbästhetik zuzuordnen. Allerdings muss man die Reihenfolge der Ebenen zu definieren, um die Farben in scale_colour_manual

library(tidyverse) 

ggplot(df,aes(x = val1, y = val2))+ 
    geom_point(aes(fill = sig), cex=2, pch = 21)+ 
    scale_fill_gradientn("Significance",colors = c("darkred", "darkblue","darkred"), values = scales::rescale(c(min(df$sig), median(df$sig), max(df$sig))))+ 
    geom_text_repel(data = dplyr::filter(df,!is.na(col)) %>% 
        mutate(col = factor(col, levels = col)), 
        aes(x = val1, y = val2, label = id, color = col), size = 6)+ 
    scale_colour_manual(values = dplyr::filter(df,!is.na(col))[,5])+ 
    theme_minimal()+ 
    theme(legend.position = "none") 

enter image description here

zweiten Ansatz geliefert passen - Farbe für geom_text_repel außerhalb des aes Anruf angeben.

ggplot(df,aes(x = val1, y = val2)) + 
    geom_point(aes(color= sig), cex=2) + scale_colour_gradient2("Significance",low="darkred",mid="darkblue",high="darkred")+ 
    geom_text_repel(data = dplyr::filter(df,!is.na(col)), aes(x = val1, y = val2, label = id), color = dplyr::filter(df,!is.na(col))[,5], size = 6)+ 
    theme_minimal()+ 
    theme(legend.position = "none") 

enter image description here

+0

Vielen Dank @missuse. Denken Sie, dass die Diskretisierung des Farbschemas die einzige Lösung ist? – dan

+0

@dan, eine weitere Lösung hinzugefügt. Überprüfen Sie die Bearbeitung – missuse

Verwandte Themen