我正在撰写行为经济学论文,必须绘制单独的折扣函数,我用 stata 绘制了下面的图表,但希望用 tikz 绘制。
我在 tikz 中玩了一下,目前得到了以下结果:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[domain=-1:5,samples=400]
\addplot+[mark=none] {1-(1-0.7*0.8)*(x+1)};
\addplot+[mark=none] {0.7*0.8^(x+1)};
\end{axis}
\end{tikzpicture}
\end{document}
输出结果如下:
遗憾的是我的截止日期快到了。有人能帮我解决以下问题吗?
y 轴的范围应为 0 到 1。
x 轴的范围应为 0 至 5,并且显示的 x 值应为函数的真实值 +1。
功能不应该交叉,只需接触即可
\addplot+[mark=none] {1-(1-0.7*0.8)*(x+1)};
从 x=-1 到 0(显示值:0 到 1)
\addplot+[mark=none] {0.7*0.8^(x+1)};
从 x=0 到 4(显示值:1 到 5)
- 两个功能应该具有相同的颜色(黑色)。
答案1
您只需将域规范添加到每个函数即可限制函数的显示部分。要在 x 轴上显示不同的值,只需从+1
函数中删除 ,将其向右移动一位即可。可以将颜色规范添加到 ,\addplot
以将其全部设置为黑色,最后,如果您想确保不显示 y 域 0:1 之外的任何数据,请使用restrict y to domain=0:1
。
编辑:以 pgfplots 方式添加轴标签。
编辑2:添加了第二个图和图例。请注意,\addlegendentry
只是按照的顺序添加条目\addplots
,并将两部分视为单独的图,因此最简单的方法是先绘制每个图的所有第一部分,设置图例,然后绘制每个图的第二部分。
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
domain=0:5,
samples=400,
% ymin=-0.1, % Uncomment if 0 should really be shown,
% ymax=1.1, % leave commented to let pgfplots figure out the exact y domain
restrict y to domain=0:1,
xlabel={Month},
ylabel={Value of Discount Function},
]
\addplot+[mark=none,black,domain=0:1] {1-(1-0.7*0.8)*(x)};
\addplot+[mark=none,blue,domain=0:1] {0.8-(1-0.7*0.8)*(x)};
\addlegendentry{A}
\addlegendentry{B}
\addplot+[mark=none,black,domain=1:5] {0.7*0.8^(x)};
\addplot+[mark=none,blue,domain=1:5] {0.7*0.8^(x)-0.2};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
代码如下:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{rotating}
\begin{document}
\begin{tikzpicture}
\begin{axis}[samples=400,
ymin = -0.1,
ymax = 1.1,
xmin = -0.3,
xmax = 5.3]
\addplot+[mark=none, domain=0:1, black] {1-(1-0.7*0.8)*x};
\addplot+[mark=none, domain=1:5, black] {0.7*0.8^x};
\end{axis}
\draw (3.5, -0.7) node [below] {Month};
\draw (-0.9, 2.7) node [left] {\rotatebox{90}{Value of Discount Function}};
\end{tikzpicture}
\end{document}
输出:
我做了什么:
将键
ymin
和添加ymax
到axis
环境中:这些设置的限制是-轴。我添加了少量填充以匹配 Stata 图表,但如果您愿意,您可以轻松地将它们设置为精确的 0 和 1。添加键
xmin
并xmax
设置限制X-轴。额外的水平填充主要通过目测和调整来确定。为了使函数翻译为 +1,我只需在两个定义中替换即可
x+1
。x
(addplot
我不完全确定你的意思,但根据 Stata 图表判断。)您不必将域设置为 的选项
axis
,而是可以将其作为 的单独参数提供addplot
。因此,我在两个绘图函数中添加了domain=0:1
和domain=1:5
,这样您就只能得到一条线。(请注意 +1 的平移以适应轴移位。)将参数添加
black
到两个addplot
命令中。
我还添加了两个\draw
命令来放置和旋转轴标签。(同样,大部分都是通过眼睛完成的,尽管我认为有更好的方法。)
答案3
解决方案来自胡戈夫德山以及来自alexwlchan缺点是它们都分段绘制分段函数,一般来说一些缺点,例如
- 当你需要在图中绘制多个函数时出现图例问题,或者
- 人们必须追踪风格。
(这些是从JM114516。
如果您知道分段函数的两个函数部分,但不知道交点在哪里,您可以简单地使用该max
函数(在这种情况下)在一个命令中绘制该函数\addplot
...
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{
% use at least this compat level
% to improve positioning of the axis labels
compat=1.3,
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
% set ymin value
ymin=0,
% in which domain should the expression be calculated ...
domain=0:5,
% ... with how many samples?
samples=400,
% add axis labels
xlabel={Month},
ylabel={Value of Discount Function},
% don't show markers
no markers,
]
% piecewise function part 1
\addplot [black!25,very thick] expression {
1-(1-0.7*0.8)*x
};
% piecewise function part 2
\addplot [black!25,very thick,dashed] expression {
0.7*0.8^x
};
% piecewise function combined
\addplot [red] expression {
max(
1-(1-0.7*0.8)*x,
0.7*0.8^x
)
};
\legend{
, % <-- empty string to ignore this `\addplot'
,
discount function,
}
\end{axis}
\end{tikzpicture}
\end{document}