绘制加权频率矩阵

绘制加权频率矩阵

我希望最好在 pgfplots 或 tikz 中创建这个图。

阴谋

我实际上已经绘制了一个版本(在所以),但我使用了 R 并使用tikz设备。我无法发布 tikz 代码,因为它远远超出了发布限制(因此我将提供 R 代码)。

ps <- ldply(0:35, function(i)data.frame(s=0:i, n=i))
 plot.new()
 plot.window(c(0,36), c(0,1))
 apply(ps[ps$s<6 & ps$n - ps$s < 30, ], 1, function(x){
   s<-x[1]; n<-x[2];
   lines(c(n, n+1, n, n+1), c(s/n, s/(n+1), s/n, (s+1)/(n+1)), type="o")})
 axis(1)
 axis(2)
 lines(6:36, 6/(6:36), type="o")
 # need to fill in the unconnected points on the upper frontier

问:所以希望直接使用 tikz/pgfplots 来绘图,而不是通过 R 和 tikzdevice。

完毕

答案1

您可以使用三个图来实现这一点:一个用于下降线,一个用于上升线(带有点),一个用于顶部的六个点的行。要使上升线停止在最后一个下降线处,您可以使用比较运算符,当0上升线高于最后一个下降线时,该运算符变为,然后除以该运算符:默认情况下,无界坐标将被删除。

\documentclass{article}
\usepackage{pgfplotstable}



\begin{document}
\begin{tikzpicture}[
    declare function={f(\x,\n) = (1/(\x)*(\n));}
]
\begin{axis}[
    restrict y to domain=0:1,
    axis lines*=left,
    ymax=1,ymin=0,
    xmin=1, xmax=36,
    xtick = {1,6,...,36},
    ytick = {0,0.5,1},
    grid=both,
    mark size=1, mark=*
]

% Draw decreasing lines
\pgfplotsinvokeforeach{1,...,6}{
    \addplot [no markers,domain=1:30+#1, samples=30+#1] {f(x,#1)};
}

% Draw increasing lines, but only up to the level of the last decreasing line
% (that's what the "1 / ..." part does. 0.001 is for preventing precision errors)
\pgfplotsinvokeforeach{1,...,30}{
    \addplot [domain=1:36, samples=36] {1-f(x,#1) * 1/( (1-(f(x,#1))) <= (f(x,6)+0.001)};
}

% Draw top markers
\addplot [domain=1:6, samples=6] {1};

\end{axis}
\end{tikzpicture}
\end{document}

相关内容