Добавить диаграмму sparkline в таблицу

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

Идеальная таблица

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

Таблица выше создана с табличной функцией из пакета Tables (и 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 или doc. 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.
    }

Похоже на это

Также возможно иметь два столбца.

Другая возможность

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

    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, то...

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

Ответ 1

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

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


```

введите описание изображения здесь

Ответ 2

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

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


```

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

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

Ответ 3

Существует также пакет под названием sparkTable, вы можете создавать объекты сглаживания и добавлять их в объект уценки. Объекты похожи на объекты 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 ...