2015-09-29 23 views
10

Sto provando a spostare tutti i miei dati scricchiolanti su Rmarkdown, anziché su SPSS + Excel, ma non riesco a capire come creare una tabella con un grafico accluso.Aggiungi grafico sparkline a una tabella

Ideal table

In Excel questo può essere fatto con sparkline dispongono o, come lo faccio, semplicemente creando un grafico e posizionandola molto accurato.

La tabella precedente viene creata con la funzione tabulare dal pacchetto Tabelle (e Pander). E incollato in Excel per creare il grafico (e l'intestazione per il grafico).

library(tables) 
library(pander) 
pander(#convert table to rmarkdown table 
    tabular( 
    (Species + 1) ~ (n=1) + Format(digits=2) * 
     (Sepal.Length + Sepal.Width) * (mean + sd), 
    data = iris), 
    caption = "Table 1. Iris") #Heading for table 

Qualcuno ha creato qualcosa di simile? Forse una soluzione alternativa al pacchetto gridExtra, anche se sono scettico sul fatto che il pacchetto possa corrispondere a tabella e grafico.


Modifica - La mia soluzione finora.
L'HTML è finito. A metà strada con il pdf. Per doc, non penso sia possibile (copia incolla in Excel).

tabella HTML
In primo luogo, in modo da R sa se sto rendering di un html, pdf o doc. out_type prende i valori: "html", "pdf" e "docx". Posso usare questo oggetto in istruzioni if.

out_type <- knitr::opts_knit$get("rmarkdown.pandoc.to") 

Ora i bar:

if(out_type == "html"){ #if output is html then: 
     my_table$Mean_Sepal_Length <- paste0(#I have a table saved as a dataframe. I add a column to it called Mean_Sepal_Length 
"<span style=' width: 100%; display: flex;'><span style='display: inline-block; border-radius: 3px; padding-right: 0; background-color: #00457C; width:", #create the bar 
     MEAN_SEPAL_L_OBJECT, #set the with of the bar. I have an object with these proportions 
"%; margin-right: 5px;'>&nbsp;</span><span>", MEAN_SEPAL_L_VARIABLE, "%</span></span>") #finally add the value behind the bar. 
    } 

Looks like this

E 'anche possibile avere due colonne.

Another possibility

Anche qui ho una tabella con le proporzioni, ho due oggetti che hanno le proporzioni di maschi e femmine.

my_table$male_female <- paste0(
"<span style=' width: 100%; display: flex;'><span>", MALE_BAR, #the proportion of males 
"%</span><span style='display: inline-block;border-top-left-radius: 3px; border-bottom-left-radius:3px; padding: 0; background-color: #00457C; width:", MALE_BAR, #width of the bar for males 
"%; margin-left: 5px;'></span><span style='display: inline-block; border-top-right-radius: 3px; border-bottom-right-radius:3px; padding:0; background-color: #AC1A2F; width:", 
FEMALE_BAR, #width of bar for females 
"%;margin-right: 5px;'></span><span>", FEMALE_BAR, #proportion of females 
"%</span></span>") 

Naturalmente si può anche avere i numeri all'interno delle barre, se lo si desidera, ma è un problema quando le barre sono piccoli.

PDF
non ho ottenuto quanto con il pdf. Qui è la mia soluzione finora:

\begin{tabular}{>{$\rhd$ }lrl} 
Loop at line 151 in divergence & \mybar{3.420}\\ 
Loop at line 1071 in radiation & \mybar{3.270}\\ 
scalar face value    & \mybar{3.090}\\ 
Loop at line 102 in get   & \mybar{1.700}\\ 
get sensible enthalpy   & \mybar{1.250}\\ 
\end{tabular} 

PDF bars

Non sembra buono. Sono molto nuovo al lattice. Devo ancora scoprire come posizionare i numeri dietro le barre. E come metterlo in una dichiarazione if nella mia funzione. Se HTML allora: se pdf allora ...

Spero che questo aiuti qualcuno. Ma per favore, considera i pacchetti menzionati in questa discussione. Sono eccellenti, la mia soluzione si basa molto su di loro. Non sono riuscito a ottenere esattamente quello che stavo cercando con i pacchetti, quindi l'ho fatto manualmente.

+2

Vedi https://github.com/htmlwidgets/sparkline – zx8754

+0

Questo è un pacchetto molto cool/widget di. Come si farebbe ad aggiungerlo a una tabella in rmarkdown, senza disegnare la tabella: in un testo come mostrato nella pagina. Ad esempio questo non funziona: 'Pander ( ddply (iris, "specie", sintetizzare, N = lunghezza (Sepal.Length), Media = medio (Sepal.Length, na.rm = T), Sd = sd (Sepal.Length, na.rm = T), spark = sparkline (Mean)) ) ' –

risposta

6

Penso che quello che ti serve è formattable package.C'è anche un example di miscelazione di sparkline con formattabile, ma non ho potuto adattarlo alle vostre esigenze.

--- 
title: http://stackoverflow.com/q/32841221/680068 
--- 

```{r cars} 

library(dplyr) 
library(formattable) 

res <- 
    iris %>% 
    group_by(Species) %>% 
    summarise(N=n(), 
      SL_Mean=round(mean(Sepal.Length),3), 
      SL_SD=round(sd(Sepal.Length),3), 
      SW_Mean=round(mean(Sepal.Width),3), 
      SW_SD=round(sd(Sepal.Width),3)) 

#using formattable 
formattable(res, 
      list(
       SL_Mean=color_bar("pink", 0.5))) 


``` 

enter image description here

+2

fammi sapere se hai bisogno di ulteriore aiuto con formattabile. – timelyportfolio

+0

@timelyportfolio Potresti aggiungere una risposta di esempio con le sparkline? 3 linee di scintillio dovrebbero mostrare un grafico a linee per "Gruppo di specie" per "Sepal.Length". – zx8754

7

Basta aggiungere un esempio sparkline alla risposta precedente. Spero che sia d'aiuto.

--- 
title: http://stackoverflow.com/q/32841221/680068 
--- 

```{r results="asis"} 

library(dplyr) 
library(formattable) 
library(sparkline) 


res <- 
    iris %>% 
    group_by(Species) %>% 
    summarise(N=n(), 
      SL_Mean=round(mean(Sepal.Length),3), 
      SL_SD=round(sd(Sepal.Length),3), 
      SW_Mean=round(mean(Sepal.Width),3), 
      SW_SD=round(sd(Sepal.Width),3)) %>% 
    mutate(sparkline = as.character(Species)) 

#using formattable 
formattable(
    res, 
    list(
    SL_Mean=color_bar("pink", proportion), 
    "sparkline"=function(z){ 
     sapply(
     z, 
     function(zz){ 
      knitr::knit(
      text = sprintf(
       '`r sparkline(c(%s))`', 
       paste0(
       iris[which(iris$Species == zz),"Sepal.Length"], 
       collapse="," 
      ) 
      ), 
      quiet = TRUE 
     ) 
     } 
    ) 
    } 
) 
) 


``` 

Inoltre, ho pensato che un non esempio potrebbe rendere alcune persone felici.

library(dplyr) 
library(formattable) 
library(sparkline) 


res <- 
    iris %>% 
    group_by(Species) %>% 
    summarise(N=n(), 
      SL_Mean=round(mean(Sepal.Length),3), 
      SL_SD=round(sd(Sepal.Length),3), 
      SW_Mean=round(mean(Sepal.Width),3), 
      SW_SD=round(sd(Sepal.Width),3)) %>% 
    mutate("sparkline" = as.character(Species)) 

#using formattable 
ft <- formattable(
    res, 
    list(
    SL_Mean=color_bar("pink", proportion), 
    "sparkline"=function(z){ 
     sapply(
     z, 
     function(zz){ 
      sprintf(
      '<span class="sparkline-bar">%s</span>', 
      paste0(
       iris[which(iris$Species == zz),"Sepal.Length"], 
       collapse="," 
      ) 
     ) 
     } 
    ) 
    } 
) 
) 

library(htmlwidgets) 
browsable(
    attachDependencies(
    tagList(
     onRender(
     as.htmlwidget(ft), 
     "function(el,x){$('.sparkline-bar').sparkline('html',{type:'bar'});}" 
    ) 

    ), 
    htmlwidgets:::widget_dependencies("sparkline","sparkline") 
) 
) 
+0

È possibile utilizzare _formattable_ con la funzione tabulare dal pacchetto _tables_? Sto cercando di creare un grande tavolo nidificato. Cioè il piccolo esempio che fornisco sopra. Posso aggiungere una barra a quel tavolo con formattabile? –

+0

proprio ora vedendo questo commento. Sei ancora interessato? Ho fatto esperimenti con il formattabile e quasi tutti i pacchetti di tavolo che posso trovare in R. – timelyportfolio

+0

Nessun problema, grazie per avermi contattato. No, in realtà non utilizzo più il pacchetto tabelle, quindi ho risolto questo problema. Grazie per il tuo aiuto; la mia soluzione era basata sul mio pacchetto. –

1

C'è anche un pacchetto chiamato sparkTable, è possibile creare oggetti sparkline e aggiungerli al vostro oggetto Markdown. Gli oggetti sono come gli oggetti ggplot che immagino tu possa fare riferimento a rmarkdown. Ma puoi anche salvare gli oggetti come pdf, eds o png.

C'è anche un oggetto scintillabile che stampa una tabella come è stata stampata.

Dalla carta (P28):

‘‘‘{r, echo=TRUE} 
require(sparkTable) 
sl <- newSparkLine (values = rnorm (25) , lineWidth = .18, pointWidth = .4, 
width = .4, height = .08) 
export(sl , outputType = "png", filename = "sparkLine ") 
‘‘‘ 
This is a sparkline included in the ![ firstSparkLine ](sparkLine.png) 
text ... 
+2

Il loro foglio (p28) nel recente [R journal] (https://journal.r-project.org/archive/2015-1/templ-kowarik-meindl.pdf) entra in dettaglio su knitr: –

+0

Grazie, questo è un bel pacchetto. Farò un tentativo e vedere se riesco a ottenere quello che sto cercando con esso. –