2016-05-16 13 views
2

Ich benutze Plotly mit Rshiny, um ein Streudiagramm mit Textbeschriftungen zu erstellen. Im Folgenden finden Sie ein reproduzierbares Beispiel:Überlappende Punkte und Text mit Plotly in Rshiny

library(ggplot2) 
library(plotly) 
dat <- data.frame(LongExpressionValue = rnorm(1:100), 
        LongMethylationValue = rnorm(1:100), 
        LongCopyNumberValue = rnorm(1:100)) 

rownames(dat) <- paste0('n',seq(1:100)) 

# ggplot 
p <- ggplot(data = dat, aes(x = LongExpressionValue, y = LongMethylationValue)) + 
    geom_point(size = 2) + geom_smooth(method = lm) + 
    geom_text(aes(label = rownames(dat)), vjust=-1.5, size = 3) 

# ggplotly 
ggplotly(p) 

Das ist wie ein Grundstück erstellt:

enter image description here

Wie stelle ich meine geom_text Optionen, so dass die Markierungen oben und nicht überlappen die Punkte erscheinen? Ich möchte meinen ggplot-Code beibehalten, damit er für verschiedene Anwendungen verwendet werden kann.

Danke!

+0

Ist es notwendig, zu verwenden 'ggplot2' und rufen Sie nicht' plot_ly' direkt? Ich finde die Lösungen für diese viel einfacher, Konfigurationen sind nur Listen von Listen etc .. Insbesondere ermöglicht die Referenzseite auf Plotly Website Positionierung aller Teile, und die Hoverinfo und Textoptionen sind erstaunlich – Shape

+0

Was, wenn Sie verwenden möchten 'aes_string' statt' aes'? –

+0

Normalerweise verwende ich 'as.name', wenn ich mit programmatisch generierten Plots arbeiten muss – Shape

Antwort

2

Versuchen Sie folgendes:

plot_ly(data = dat, 
     x = LongExpressionValue, 
     y = LongMethylationValue, 
     text = rownames(dat), 
     marker = list(size = 10), 
     mode = "markers+text", 
     textposition = 'top center') 

es nicht wert ist zu hart an ggplot2 arbeiten, wenn Sie direkt an die Quelle gehen kann. Dies ist von unschätzbarem Wert: https://plot.ly/r/reference/

Alles in plot_ly oder in layout eine Liste von Listen, so dass Sie Ihre Parameter einfach einstellen können (man beachte marker = list(size = 10))

EDIT: Ein etwas schwieriger man die Macht des hoverinfo + Textes zeigt zusammen:

plot_ly(data = dat, 
     x = LongExpressionValue, 
     y = LongMethylationValue, 
     text = paste0(rownames(dat), 
         '<br>A:', 1:nrow(dat), #Examples of additional text 
         '<br>B:', sample(nrow(dat))), #Examples of additional text 
     hoverinfo = 'text+x+y', 
     marker = list(size = 10), 
     mode = "markers+text", 
     hoverinfo = 'text', 
     textposition = 'top right') 
+1

Oh in Ordnung, ich werde es versuchen. Ich hatte einfach meinen ganzen Code in ggplot2 und dachte, es wäre einfacher, wenn ich die Funktion ggplotly() hinzufügen würde, um meine vorhandenen Plots in plotly umzuwandeln. –

+0

Wenn Sie den Text oben nicht zeigen müssen, und es lieber Teil des Hover-Over wäre, empfehle ich, den "+ Text" aus dem Modus – Shape

1

Wenn Sie mit ggplot2 haften möchten und Ihre glatte Linie zu halten, könnte man leicht die Größe Ihres Punkt erhöhen und Ihr Etikett in jedem Punkt hinzufügen:

p <- ggplot(data = dat, aes(x = LongExpressionValue, y = LongMethylationValue)) + 
    geom_point(size = 7) + geom_smooth(method = lm) + 
    geom_text(aes(label = rownames(dat)), size = 2, color="white") 

# ggplotly 
ggplotly(p) 

enter image description here

+0

entfernen Leider funktioniert das nicht, wenn Sie lange haben Variablennamen. Zum Beispiel könnte ich anstelle von n1 thisismylongvariablenname haben. Und es würde nicht in den Kreis passen. –

1

Wenn Sie in ggplot2 bleiben möchten, müssen Sie auf die plotly_build Liste textposition Element anhängen. textposition fehlt in der ursprünglichen plotly_build auch wenn hjust und vjust Optionen festgelegt sind.

So funktioniert das:

#devtools::install_github("ropensci/plotly") # if not already done 
library(ggplot2) 
library(plotly) 
dat <- data.frame(LongExpressionValue = rnorm(1:100), 
       LongMethylationValue = rnorm(1:100), 
       LongCopyNumberValue = rnorm(1:100)) 

rownames(dat) <- paste0('n',seq(1:100)) 

gg <- ggplot(data = dat, aes(x = LongExpressionValue, y =LongMethylationValue)) + 
geom_point(size = 1) + 
geom_smooth(method = lm) + 
geom_text(aes(label = rownames(dat)), size = 3) 

p <- plotly_build(gg) 

length<-length(p$x$data) 
invisible(lapply(1:length, function(x) p$x$data[[x]]<<-c(p$x$data[[x]], textposition ='top center'))) 

p