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