
Este é o meu código
\documentclass[11pt,a4paper]{article}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usetikzlibrary{calc,intersections,through,backgrounds,snakes}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepgfplotslibrary{statistics}
\begin{document}
\begin{center}
\begin{tikzpicture}
\begin{axis}[
width=1*\textwidth,
height=8cm,
ymin=0,
ymax=7,
title=Histogram lichaamslengte,
ybar interval,
xticklabel={[\pgfmathprintnumber\tick--\pgfmathprintnumber\nexttick [}],
\addplot+[hist={bins=4, data max=12,data min=0}]
table[row sep=\\,y index=0] {
data\\
1\\ 2\\ 1\\ 5\\ 4\\ 10\\ 4\\ 5\\ 7\\ 10\\ 9\\ 8\\ 9\\ 9\\ 11\\
};
\end{axis}
\tkzDefPoints{2.1/2.75/A, 4.3/3.7/B, 6.7/1.8/C, 9/5.5/D}
\tkzDrawPoints(A,B,C,D)
\tkzDrawSegment(A,B)
\tkzDrawSegment(B,C)
\tkzDrawSegment(C,D)
\end{tikzpicture}
\end{center}
\end{document}
Consegui fazer o histograma, mas também quero um polígono de frequência em cima do histograma. A solução que encontrei não é nada boa porque não é escalável. Então minha pergunta é: como posso fazer esse polígono, que está usando os médios das classes. Se possível, automaticamente. Obrigado!
Responder1
Você pode desenhar o gráfico do histograma duas vezes, uma vez como ybar interval
no seu exemplo e a segunda vez como sharp plot
.
Para visualizar um hist
gráfico de uma forma diferente, pode-se redefinir o handler
estilo dentro das opções de hist
:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through,backgrounds,snakes}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepgfplotslibrary{statistics}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
width=1*\textwidth,
height=8cm,
ymin=0,
ymax=7,
title=Histogram lichaamslengte,
ybar interval,
xticklabel={[\pgfmathprintnumber\tick--\pgfmathprintnumber\nexttick [}],
\addplot+[hist={bins=4, data max=12,data min=0}]
table[row sep=\\,y index=0] {
data\\
1\\ 2\\ 1\\ 5\\ 4\\ 10\\ 4\\ 5\\ 7\\ 10\\ 9\\ 8\\ 9\\ 9\\ 11\\
};
\addplot[
%
% there seems to be a bug in pgfplots which would shift the two
% 'hist' plots as if both were bar plots.
% This is one possible work-around:
forget plot,
%
mark=*,
hist={bins=4, data max=12,data min=0,
% this here should *not* become an ybar interval:
handler/.style={sharp plot},intervals=false,
},
%
% .. but since the other plot is shown with intervals, we should
% shift this here accordingly:
shift={(axis direction cs:1.5,0)},
]
table[row sep=\\,y index=0] {
data\\
1\\ 2\\ 1\\ 5\\ 4\\ 10\\ 4\\ 5\\ 7\\ 10\\ 9\\ 8\\ 9\\ 9\\ 11\\
};
\end{axis}
\end{tikzpicture}
\end{document}
Esta experiência me revelou que há espaço para melhorias:
sem
forget plot
,pgfplots
assume que há dois gráficos de barras e torna "ambos" menores. Isso é um bug;forget plot
é uma solução possível (uma solução diferente seria modificarbar interval width
ebar interval shift
para oprimeirotrama). Vou fazer uma anotação de tarefas parapgfplots
; isso se tornará desnecessário eventualmente.é preciso entrar,
interval=false
embora fique claro pelo contexto quesharp plot
não precisa de intervalo. Vou fazer uma anotação de tarefas parapgfplots
; isso se tornará desnecessário eventualmente.
Verificarei o manipulador de histograma e corrigirei bugs e problemas de usabilidade em torno dele eventualmente (provavelmente na próxima versão do pgfplots
).
Responder2
Como resposta parcial, usando
xmin=0,xmax=12,name=border,
dentro da definição xaxis você pode criar coordenadas escalonáveis, por exemplo
\coordinate (Y) at ($.143*(border.north) - .143*(border.south)$);
\coordinate (A) at ($(border.south west)!.125!(border.south east) + 3*(Y)$);
onde (Y) é o comprimento de uma unidade de mudança vertical. No entanto, você ainda precisa calcular os valores do histograma (novamente) ou descobrir onde o Tikz os colocou.
Responder3
\begin{tikzpicture}
\begin{axis}[
width=1*\textwidth,
height=9cm,
xmin=-1,xmax=13,
ymin=0, ymax=7,
title=Histogram lichaamslengte,
ybar interval,
xticklabel={[\pgfmathprintnumber\tick;\pgfmathprintnumber\nexttick [}],
\addplot+[hist={bins=4, data max=12,data min=0}]
table[row sep=\\,y index=0] {
data\\
1\\ 2\\ 1\\ 5\\ 4\\ 10\\ 4\\ 5\\ 7\\ 10\\ 9\\ 8\\ 9\\ 9\\ 11\\
};
\addplot[sharp plot,mark=square]
coordinates
{(1.5,3) (4.5,4) (7.5,2) (10.5,6)};
\end{axis}
\end{tikzpicture}
Responder às suas próprias perguntas é como o Sr. Beam enviando cartões para si mesmo. Mas de qualquer forma, obrigado pelas respostas. Depois de consultar o manual do pgf, a maneira mais simples para mim é adicionar um gráfico com as coordenadas, é escalável e não leva muito tempo.
Resultando em: