Создание таблиц R со встроенной графикой

Я хотел бы иметь возможность создать таблицу, в которой один из столбцов будет графическим, а другой - текстовым. В идеале я бы создал электронную таблицу Excel, но я уверен, что ни один из пакетов R to Excel не может записывать PDF-файлы в ячейки. Я думаю, что могу собрать что-то вместе, используя Knittr или Sweave, хотя я точно не знаю, как это сделать. Любой совет?


person rimorob    schedule 27.10.2013    source источник
comment
Что сделало бы этот вопрос лучше, если бы вы привели небольшой воспроизводимый пример. Дайте нам немного данных, покажите нам, как вы создаете таблицу в Knitr или Sweave без изображения, и дайте нам пример изображения, которое вы хотите вставить.   -  person nograpes    schedule 28.10.2013
comment
Ну вот беда, я еще ни разу не использовал Knitr или Sweave, поэтому даже такой пример быстро сгенерировать не могу. Тем не менее, это то, что я хочу, чтобы это выглядело в Excel, более или менее. Графики будут более привлекательными (ggplot) media.juiceanalytics.com/images/blog/excel_positivenegative. gif   -  person rimorob    schedule 28.10.2013
comment
Возможный дубликат stackoverflow.com/questions/16680063/   -  person EDi    schedule 28.10.2013
comment
у вас есть один рисунок на строку или один рисунок для выравнивания со всеми строками?   -  person baptiste    schedule 28.10.2013
comment
Что касается идеи добавления текста в ggplot2, это может сработать, но неудобно, так как многие строки не будут иметь никакого графика (они не должны), поэтому, другими словами, я бы строил таблицу как график, даже когда мне не нужен график. Но это может быть обходной путь....   -  person rimorob    schedule 29.10.2013
comment
На самом деле преобразование таблицы в формат графика и упорядочивание через grid.arrange НЕ является хорошим вариантом: мне нужно, чтобы текст можно было выбрать.   -  person rimorob    schedule 29.10.2013
comment
Итак, если бы я делал это, я бы использовал Sweave и Latex. К сожалению, у него довольно крутая кривая обучения. Я не знаю, что xtable (команда goto R для создания латексных таблиц) может добавлять графику, поэтому вам придется создавать таблицу в латексе и добавлять графику через R. Это было бы проще всего с фиксированным форматом таблицы.   -  person PaulHurleyuk    schedule 03.11.2013


Ответы (1)


Я попытался воспроизвести ваш пример:

ваш пример

Итак, я изучил набор данных R и использовал набор данных бейсбола, хотя у меня есть мучительное сомнение, что для бейсболистов g-r может выглядеть очень глупо...

Так или иначе, я привел два примера использования функции get_bar_df и попытался как можно больше прокомментировать свой сценарий, чтобы помочь вам его использовать.

два примера с полосами

Скрипт представляет собой автономный сценарий sweave, который необходимо запустить с помощью Knitr или sweave.

\documentclass{article}
\usepackage[table,dvipsnames]{xcolor}% http://ctan.org/pkg/xcolor
\usepackage[nomessages]{fp}% http://ctan.org/pkg/
\newlength{\maxlen}
\newcommand{\databarright}[2][gray!25]
{%
    \settowidth{\maxlen}{\maxnum}%
    \addtolength{\maxlen}{\dimexpr2\tabcolsep-\arrayrulewidth}%
    \FPeval\result{round(#2/\maxnum:4)}%
    \rlap{\color{#1}\hspace*{\dimexpr-\tabcolsep+0.1\arrayrulewidth}\rule[-.05\ht\strutbox]{\result\maxlen}{.95\ht\strutbox}}%
    \makebox[\dimexpr\maxlen-2\tabcolsep+\arrayrulewidth][r]{\phantom{XXX}}%
}

\newcommand{\databarleft}[2][red!25]
{%
    \settowidth{\maxlen}{\maxnum}%
    \addtolength{\maxlen}{\dimexpr2\tabcolsep-\arrayrulewidth}%
    \FPeval\result{round(#2/\maxnum:4)}%
    \makebox[\dimexpr\maxlen-2\tabcolsep+\arrayrulewidth][r]{\phantom{XXX}}%
    \llap{\color{#1}\rule[-.05\ht\strutbox]{\result\maxlen}{.95\ht\strutbox}\hspace*{\dimexpr-\tabcolsep-4\arrayrulewidth}}%    
}
\begin{document}
<<load_libraries, echo = FALSE, eval = TRUE, results ="hide">>=
library(knitr) 
library(xtable)
@
<<get_bar_df, echo = FALSE, eval = TRUE, results ="hide">>=
#' @title get_databar creates labels for xtable in a dataframe
#' @description It will create two new columns and fill them with values for xtable, it will use the last column
#' @param data the dataframe
#' @param colorpos one color for positive values that is interpretable by the xcolor dvips
#' one of 68 standard colors known to dvips  \link{https://en.wikibooks.org/wiki/LaTeX/Colors}, default "grey"
#' @param colorneg one color for negative values default "red"
#' @param transparent, the percentage of transparency passed to labels default 50 use zero for no transparency
#' @param caption, caption passed to xtable. 
#' @param vline, add a vertical line at the end of the table  default FALSE
#' @return A dataframe with the last two columns edited for xtable
get_bar_df <- function(data,
    colorpos = "grey",
    colorneg="red",
    transparent=50,
    caption="",
    vline=FALSE)
{
  if (transparent!=0){
    colorpos <- paste0(colorpos,"!",transparent)
    colorneg <- paste0(colorneg,"!",transparent)
  }
  the_col <- ncol(bsb)
  idxneg <- data[,the_col] < 0
  idxpos <- data[,the_col] > 0
  data[idxneg,"\\phantom{neg}"] <- paste0("\\databarleft[",colorneg,"]{", -data[idxneg,the_col],"}")
  data[idxpos,"\\phantom{pos}"] <- paste0("\\databarright[",colorpos,"]{", data[idxpos,the_col],"}")
  maxnum <<- max(abs(data[,the_col])) # value assigned in .GlobalEnv for later use by latex
  if (!vline) {
  xdata <-xtable(data, align = rep("l",ncol(data)+1), caption = caption)  
  } else {
      xdata <-xtable(data, align = c(rep("l",ncol(data)),"|l"), caption = caption)    
  }
  return(xdata)
} 
@
<<test, echo = FALSE, eval = TRUE, results ="hide">>=
library(plyr)
library(dplyr)
bsb <- select(baseball, id, year, g, r) %>% filter(year == 1872) %>% transform(gr = g - 
            r)
bsb1 <- select(baseball, id, year, g, r) %>% filter(year == 1873) %>% transform(gr = g - 
            r)
xbsb <- get_bar_df(data = bsb, caption="example with default values")
xbsb1 <- get_bar_df(data = bsb1, 
    colorpos = "MidnightBlue",
     colorneg = "Goldenrod", 
    transparent = 60, 
    caption = "Another example with MidnightBlue, Goldenrod, transparent= 60, vline=TRUE",
    vline=TRUE)
print.xtable(xbsb, sanitize.text.function = identity, file = "bsb.tex", hline.after = NULL, include.rownames =FALSE)
print(xbsb1, sanitize.text.function = identity, file = "bsb1.tex", hline.after = NULL, include.rownames =FALSE)
@
% this must come after the chunk (maxnum is defined in the chunk)
\newcommand{\maxnum}
{%
    \Sexpr{maxnum}
}

\input{bsb.tex}
\input{bsb1.tex}  
\end{document}

Часть кода взята из этого отличного поста: https://tex.stackexchange.com/questions/81994/partially-coloring-cell-background-with-histograms

person Cedric    schedule 05.11.2017