2016-12-08 10 views
1

Ich habe die folgende Funktion mit ggplot2 Plot. Ein Feature der Funktion ist der str_wrap Funktionsaufruf, um die sehr langen Etiketten zu behandeln, die ich habe.R - Handle lange Etiketten in Plot

PlotResponseRate <- function(EntryData) 
{ 
    PlotData <- as.data.frame(apply(X = EntryData, MARGIN = 2, 
              function(x) round(length(which(!is.na(x)))/length(x)*100))) 
    colnames(PlotData) <- "TheData"  
    PlotData$TheLabel <- factor(str_wrap(colnames(EntryData), width = 30), 
            levels = unique(str_wrap(colnames(EntryData), width = 30))) 

    Graphe <- ggplot(data = PlotData, aes(x = TheLabel, y = TheData)) + 
    geom_bar(stat = "identity", fill = "red", width = 0.8) + 
    coord_flip() + 
    labs(title = "Response rate") 
    } 

Es funktioniert in der „normalen“ R environnement in Ordnung und ich möchte es mit plotly verwenden. Deshalb füge ich die folgende Codezeile:

PlotData$TheLabel <- gsub(pattern = "\n", replacement = "\n<br>", PlotData$TheLabel) 

Es scheint zu funktionieren, aber es gibt noch ein Problem: der Raum, in dem links neben dem Grundstück zu breit ist (ich bin nicht sicher, aber es sieht aus wie es ist der gleiche Raum, den das lange Etikett tun würde).

Wie umgehen Sie dieses Verhalten?

Hier ist ein einfaches Beispiel:

library(stringr) 
library(ggplot2) 
library(plotly) 

a <- c(1, 2, 2, 2, NA, 1, 2, 2, 1) 
b <- c(2, 1, 2, NA, 2, NA, 1, NA, 1) 
df <- data.frame(a, b) 

colnames(df) <- c("This Is A Long Answer To A Long Question Label For The First Question", 
        "This Is A Long Answer To A Long Question Label For The Second Question") 

TheGgplot2Plot <- PlotResponseRate(df) 

ThePlotlyPlot <- ggplotly(TheGgplot2Plot) 
print(ThePlotlyPlot) 

enter image description here

Antwort

2

Sie können plotly_build() verwenden, um die Ränder einzustellen.

Diese generische Funktion erstellt das Listenobjekt, das an plotly.js für Rendering gesendet wird. Die Verwendung dieser Funktion kann nützlich sein, um die von ggplotly/plot_ly bereitgestellten Standardwerte zu überschreiben oder um Fehler beim Rendern zu beheben.

Verwenden plotly_build die Liste Objekt zu erzeugen:

ThePlotlyPlot <- plotly_build(TheGgplot2Plot) 

Ansicht der Struktur:

str(ThePlotlyPlot) 

..$ layout :List of 13 
    .. ..$ margin  :List of 4 
    .. .. ..$ t: num 57.7 
    .. .. ..$ r: num 7.31 
    .. .. ..$ b: num 54.1 
    .. .. ..$ l: num 481 

die Ränder einstellen:

ThePlotlyPlot$x$layout$margin$l <- 100 

enter image description here

+0

Dank, es funktioniert in R, aber ich habe einen Fehler in Shiny 'Ausgang $ TheResponseRate <- renderPlotly ({ MyPlot <- PlotResponseRate (entrydata = df) MyPlot <- plotly_build (MyPlot) MyPlot $ x $ layout Marge $ $ l <- 180 }) ' – Kumpelka

+0

Die Nachricht ist" Fehler in UseMethod: keine Methode für 'ggplotly' anwendbar auf ein Objekt der Klasse" c ('double', 'numeric') ". – Kumpelka