2016-04-06 9 views
0

Ich verwende rcdimple, um eine Reihe von facettierten Barplots basierend auf einer kategorischen Spalte zu erstellen. Die Plots kommen wie erwartet heraus, aber ich kann nicht herausfinden, wie man ein Label auf jeden Subplot anwendet.rcdimple facet function subplot Etiketten

Im Beispiel unten Ich habe Ich habe einige Optionen kommentiert ausprobiert:

fake.data <- read.table(sep=',', header=T, text=" 
    category,variable,value,count 
    A Category,SITE.ACTIVITIES,1,51 
    A Category,SITE.ACTIVITIES,2,116 
    A Category,SITE.ACTIVITIES,3,46 
    A Category,PROXIMITY.TO.RECEPTORS,1,17 
    A Category,PROXIMITY.TO.RECEPTORS,2,111 
    A Category,PROXIMITY.TO.RECEPTORS,3,93 
    All Others,SITE.ACTIVITIES,1,60 
    All Others,SITE.ACTIVITIES,2,37 
    All Others,SITE.ACTIVITIES,3,54 
    All Others,PROXIMITY.TO.RECEPTORS,1,80 
    All Others,PROXIMITY.TO.RECEPTORS,2,167 
    All Others,PROXIMITY.TO.RECEPTORS,3,120 
    ") 



plt <- fake.data %>% 
    dimple(x ="value", y = "count", 
      #title = c('A Category','All Others'), 
      groups = 'category', type = "bar", 
      width = 900, height = 220) %>% 
     facet('variable', 
       #title = c('A Category','All Others'), 
       removeAxes = T) %>% 
     default_colors(c('blue','grey')) %>% 
     xAxis(type = "addCategoryAxis", 
       #facet.title = c('A Category','All Others'), 
       orderRule = "value") %>% 
     yAxis(overrideMax=300, ticks=4) %>% 
     add_legend() %>% 
     add_title(text = c('A Category','All Others')) 

enter image description here

Nach Abbildung 2.14 in this Blog-Post zu sehen, ich folgendes hinzugefügt:

plt$x$options$tasks <- list(htmlwidgets::JS(' 
    function(){ 
     //this.widgetDimple should hold our chart 
     var chart1 = this.widgetDimple[0]; 
     var chart2 = this.widgetDimple[1]; 
     chart1.svg.append("text") 
     .attr("x", chart1.axes[0]._scale(3)) 
     .attr("y", chart1.axes[1]._scale(300)) 
     .attr("text-anchor", "middle") 
     .text("A Category") 
     chart2.svg.append("text") 
     .attr("x", chart2.axes[0]._scale(3)) 
     .attr("y", chart2.axes[1]._scale(300)) 
     .attr("dy", "0.6em") 
     .attr("text-anchor", "middle") 
     .text("All Others") 
     } 
     ')) 
plt 

Ich denke, ich bin auf dem richtigen Weg, denke aber, es gibt wahrscheinlich eine sauberere Möglichkeit, dies zu tun (tut mir leid, mein Javascript ist nicht so toll).

enter image description here

Antwort

0

Die einfachste Lösung scheint Text über svg.append("text") hinzufügen zu sein, wie oben beschrieben. Die Facettenfunktion rcdimple erstellt ein Array von Diagrammobjekten, eines für jedes Teilplot. Im Gegenzug enthält jedes Unterplot die Informationen, die für jedes Etikett benötigt werden, das über OBJECT.data[0].variable zugänglich ist.

Die unten dargestellte Lösung funktioniert für eine beliebige Anzahl von Facettengrafikobjekten. Die Nummern 1 und 350 beziehen sich auf die x- und y-Position der Beschriftungen, die sich auf die x- und y-Achsenwerte beziehen. Diese müssten für verschiedene Datensätze modifiziert werden

plt <- fake.data %>% 
     dimple(x ="value", y = "count", 
       groups = 'category', type = "bar", 
       width = 900, height = 220) %>% 
      facet('variable',removeAxes = T) %>% 
      default_colors(c('blue','grey')) %>% 
      xAxis(type = "addCategoryAxis",orderRule = "value") %>% 
      yAxis(overrideMax=300, ticks=4) %>% 
      add_legend() %>% 
      add_title(text = 'Plot Title') 


plt$x$options$tasks <- list(htmlwidgets::JS(sprintf(' 
    function(){ 
     var n = this.widgetDimple.length 
     var variables = {}; 
     var subs = []; 
     for (var i = 1; i <= n; ++i) subs.push("c"+i) 
     for(var i = 0; i < n; i++) { 
      var v = subs[i]; 
      variables[v] = this.widgetDimple[i] 
      variables[v].svg.append("text") 
      .attr("x", variables[v].axes[0]._scale(%s)) 
      .attr("y", variables[v].axes[1]._scale(%s)) 
      .attr("text-anchor", "left") 
      .text(variables[v].data[0].variable) 
     }; 
    } 
    ', 1, 350))) 
plt 

Es mag eine elegantere Lösung geben, mein JS ist nicht großartig. Dank Autoren des rcdimple Paket und den Beispielen angegebenen here

enter image description here