2015-09-29 4 views
10

Я пытаюсь переместить все мои данные хрустом в Rmarkdown вместо SPSS + Excel, но не могу понять, как создать таблицу с добавлением графика.Добавить диаграмму sparkline в таблицу

Ideal table

В Excel это можно сделать с инфокривой особенностью или, как я это делаю, просто создавая график и размещение его очень точно.

Таблица выше создана с использованием табличной функции из таблицы Таблицы (и Pander). И вставлен в Excel для создания графика (и заголовка для графа).

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 

Создал ли кто-нибудь подобное? Возможно, обходной путь с пакетом gridExtra, хотя я скептически отношусь к тому, что пакет может сопоставлять таблицу и график.


Редактировать - Мое решение до сих пор.
HTML закончен. На полпути с помощью pdf. Для документа я не думаю, что это возможно (скопировать в Excel).

HTML таблица
Во-первых, таким образом R знает, если я рендеринга HTML, PDF или документ. out_type принимает значения: «html», «pdf» и «docx». Я могу использовать этот объект в операторах if.

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

Теперь бары:

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

Это также можно иметь две колонки.

Another possibility

Здесь снова у меня есть таблица с пропорциями, у меня есть два объекта, которые имеют пропорции мужчин и женщин.

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>") 

Конечно, вы можете также иметь номера внутри стержней, если хотите, но это проблема, когда бары маленькие.

PDF
я не получил, насколько с PDF. Вот мое решение до сих пор:

\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

Это не выглядит так хорошо. Я очень новичок в латексе. Мне все еще нужно выяснить, как разместить номера за решеткой. И как включить это в оператор if в моей функции. Если HTML тогда: if pdf, то ...

Надеюсь, это поможет кому-то. Но, пожалуйста, рассмотрите пакеты, упомянутые в этой теме. Они превосходны, мое решение очень основано на них. Я просто не мог получить то, что искал с пакетами, поэтому сделал это вручную.

+2

См https://github.com/htmlwidgets/sparkline – zx8754

+0

Это очень крутой пакет/виджет. Как можно было бы добавить его в таблицу в rmarkdown, не составляя таблицу: в тексте, как показано на странице. Например, это не работает: 'Pander ( ddply (ирис, "вид", обобщать, N = длина (Sepal.Length), Среднее = Среднее (Sepal.Length, na.rm = Т), Sd = sd (Sepal.Length, na.rm = T), spark = sparkline (среднее значение)) ) ' –

ответ

6

Я думаю, что вам нужно formattable package.Существует также example смежных искровых линий с возможностью форматирования, но я не мог адаптировать его к вашим потребностям.

--- 
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

Сообщите мне, если вам нужна дополнительная помощь с возможностью форматирования. – timelyportfolio

+0

@timelyportfolio Не могли бы вы добавить пример ответа с искровой линией? 3 sparklines должны отображать линейную диаграмму для 'Species group' для' Sepal.Length'. – zx8754

7

Просто добавив спарклайн пример к предыдущему ответу. Надеюсь, поможет.

--- 
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 
     ) 
     } 
    ) 
    } 
) 
) 


``` 

Кроме того, я думал, что не- примером может сделать некоторые люди счастливы.

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

Можно ли использовать _formattable_ с табличной функцией из пакета _tables_? Я пытаюсь сделать большую вложенную таблицу. То есть небольшой пример, который я предоставляю сверху. Могу ли я добавить панель в эту таблицу с возможностью форматирования? –

+0

как раз сейчас посмотрев этот комментарий. Ты все еще интересуешься? Я провел эксперименты с форматом и почти каждый стол, который я могу найти в R. – timelyportfolio

+0

Нет проблем, спасибо, что вернулись ко мне. Нет. Я больше не использую пакет таблиц, поэтому я получил это. Btw благодарит за вашу помощь; мое решение было основано на вашем пакете. –

1

Существует также пакет под названием sparkTable, вы можете создать SPARKLINE объекты и добавить их к объекту уценки. Объекты похожи на объекты ggplot, которые, как я предполагаю, вы можете ссылаться на rmarkdown. Но вы также можете сохранить объекты в формате pdf, eds или png.

Существует также объект sparkTable, который печатает таблицу, как вы напечатали.

Из бумаги (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

Их статья (p28) в недавнем журнале [R journal] (https://journal.r-project.org/archive/2015-1/templ-kowarik-meindl.pdf) подробно рассказывает о книжере: –

+0

Спасибо, это классный пакет. Я попробую и посмотрю, смогу ли я получить то, что я ищу. –

Смежные вопросы