Автоматически создавать изображение на основе статистических данных

Автоматически создавать изображение на основе статистических данных

Я ищу способ автоматически создавать изображения, подобные приведенному ниже:

График диаграммы Барта

MWE нет, потому что все, что у меня есть на данный момент, это это изображение (созданное, как я полагаю, SPSS, но я не имею к этому никакого отношения). Я мог бы просто добавить это изображение в свой документ, конечно, но поскольку эти проблемы возникают с некоторой частотой, я хотел бы попробовать "родной" способ LaTeX, так сказать. Я почти уверен, что какой-то графический пакет более чем справится с этой задачей, но я даже не знаю, с чего начать поиски.

Я не ожидаю, что вы сделаете всю работу за меня, поэтому все, о чем я прошу, это указание в правильном направлении, FAQ, HOWTO, возможно, пример.

решение1

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

EDIT: как рекомендует Джейк, использование \addplot tableвместо \addplot plot coordinatesизбавляет от многих хлопот.

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

\documentclass{book}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}
\definecolor{mybarcolor}{RGB}{210 207 155}
\pgfmathsetmacro{\xmin}{-.5}
\begin{axis}[ymin=0,%
    xmin=\xmin,%
    xtick={0,2,4,6},%
    xticklabels={.00,2.00,4.00,6.00},%
    axis background/.style={fill=black!10},%
    ylabel=\textbf{H\"{a}ufigkeit},%
    xlabel=$D_\mathrm{rel}$,%
]
\addplot[ybar interval,fill=mybarcolor] table {%
0   7
.5  38
1   23
1.5 8
2   8
2.5 8
3   2
3.5 1
4   2
4.5 0
5   0
5.5 1
6   1
};
\addplot[domain=\xmin:6,samples=100] {18*exp(-.5*(x-1.5)^2)};
\end{axis}
\end{tikzpicture}
\end{document}

решение2

Вот немного измененный пример из руководства Asymptote. Он не только автоматически создает изображение из статистических данных, но и демонстрирует, как генерировать данные в первую очередь. Обработайте следующий hist.asyфайл с помощью asy -f pdf hist.asy.

import graph;
import stats;
size(400,200,IgnoreAspect);

real lineWidth=2pt;
pen histFillPen=rgb(217/255, 206/255, 143/255)+opacity(0.7);
pen histLinePen=black;
pen linePen=red+lineWidth; 
pen bgPen=rgb(241/255, 240/255, 238/255); 

int n=10000;
real[] a=new real[n];
for(int i=0; i < n; ++i) a[i]=Gaussrand();

path g=graph(Gaussian,min(a),max(a));

pair gMin=min(g);
pair gMax=max(g)+(0,0.05);

filldraw(box(gMin,gMax),bgPen,black);

draw(g,linePen);

// Optionally calculate "optimal" number of bins a la Shimazaki and Shinomoto.
int N=bins(a);
histogram(a,min(a),max(a),N,normalize=true,low=0,fillpen=histFillPen,drawpen=histLinePen,bars=true);

xaxis("$x$",BottomTop,RightTicks);
yaxis("$dP/dx$",LeftRight,RightTicks(trailingzero));

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

решение3

Если вы готовы использовать другой инструмент для создания графика в формате PDF и включения его в ваш TeX, я определенно порекомендую gnuplot. Он довольно мощный, и с его помощью вы можете фактически построить график всего, что захотите. Для автоматического создания графика вам нужно будет включить команду gnuplot в ваш LaTeX Makefile или последовательность. Вы также можете параметризовать файл данных, если хотите сгенерировать несколько похожих графиков из нескольких файлов данных.

решение4

МВЭ

Я думаю, что создание документа LateX с изображениями (и текстовыми результатами), автоматически сгенерированными из статистических данных, — это работа длярсПлетениеиливязать.

Короче говоря, вы можете создать обычный документ LateX, который имеет расширение .Rnw вместо .tex(файл noweb) со вставленными «кусками» кода R. Затем Sweave в R экспортирует его как настоящий .texфайл, где куски R изменяются кодом LateX с результатами (изображениями, таблицами или текстом), сгенерированными этими кусками R. Затем вы можете скомпилировать файл .texкак pdflatexобычно.

Например, минимальный test.Rnwфайл с минимальным фрагментом R может быть следующим:

\documentclass{article}
\begin{document}
<<>>=
2+3
@
\end{document}

Приведенный выше файл с .texрасширением и скомпилированный с помощью pdflatex создаст просто:

<<>>= 2+3 @

Но преобразованный с R CMD Sweave test.Rnwвами, вы получите это test.tex:

\documentclass{article}
\usepackage{Sweave}
\begin{document}
\begin{Schunk}
\begin{Sinput}
> 2+3
\end{Sinput}
\begin{Soutput}
[1] 5
\end{Soutput}
\end{Schunk}

Скомпилированный (с помощью pdflatex test.tex) результат:

> 2+3

[1] 5

Ну, не очень впечатляет, просто покажите простую сумму, как показано в консоли R. Но R — фантастическая статистическая программа, и результатом фрагмента R может быть \includegraphics{}с красивым графиком или полная таблица LaTeX float ( \begin{table} ...), с отображением или без отображения входных данных. Даже результаты, которые являются простыми числами, можно вставить в текст с помощью \Sexpr(пример: \Sexpr{2+3}}. Таким образом, например, для создания периодических статистических отчетов LaTeX, только изменив исходные данные, управляемые R (простой .csvфайл, например) двумя командами или простым скриптом, вы можете получить автоматически обновленные графики, а также обновленные таблицы и обновленные результаты в виде простого текста. Без редактирования кода LaTeX каждый раз. И без открытия R. Теперь этого достаточно впечатляет?.

Приведенный выше снимок экрана был создан с помощью этого более подробного hist.Rnwфайла:

% File: hist.Rnw
%
% Usage:  
%
% R CMD Sweave hist.Rnw 
% pdflatex hist.tex

\documentclass{article}
\usepackage[utf8]{inputenc} 
\usepackage{lipsum} 
\begin{document}

\lipsum[1] % dummy text

\begin{figure}[h]   
\centering

% R Chunk 
<<Histogran,echo=F,fig=T>>=

# Some random data
foo <- rnorm(1000, mean=1, sd=1)

# The histogram 
hist(foo, prob=TRUE, border="tan4", ylab="Häufigkeit",
xlab="D_rel",col=rainbow(25,start=.4,end=.35), main="")

# To have also the ugly background area (optional): 
rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], 
col =  "lightgrey") 

hist(foo, prob=TRUE, border="tan4", ylab="Häufigkeit",
xlab="D_rel",col=rainbow(40,start=.1,end=.4), main="",  add=T) 

# Density plot
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), 
lwd=2, col="darkred", add=T)

@ % end of R chunk

\caption{This is a histogram of foo population with
mean=\Sexpr{round(mean(foo),2)} and sd=\Sexpr{round(sd(foo),2)}. 
On the other hand,  significance of Shapiro-Wilk test of normality is
p=\Sexpr{signif(shapiro.test(foo)$p.value,2)}, so this is a normal
population as sure as 2+2=\Sexpr{2+2}, as everybody knows (except some 
processors with floating point bugs). }


\end{figure}

\lipsum[3] % more dummy text

\end{document}

Связанный контент