我希望最好在 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}