私は行動経済学の論文を書いており、個別の割引関数を描く必要があります。次のグラフは 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
関数から を削除して、 を 1 つ右にシフトするだけです。 に色指定を追加して\addplot
すべてを黒に設定することもできます。最後に、 y ドメイン 0:1 の外側のデータが表示されないようにするには、 を使用しますrestrict y to domain=0:1
。
編集:pgfplots の方法で軸ラベルを追加しました。
編集2:2 番目のプロットと凡例を追加しました。 は、\addlegendentry
の順序でエントリを追加する\addplots
だけで、2 つの部分を別々のプロットとして扱うので、最も簡単な方法は、まず各プロットの最初の部分をすべてプロットし、凡例を設定してから、各プロットの 2 番目の部分をプロットすることです。
\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
制限を設定するバツ-軸。追加の水平方向のパディングは、主に目視と微調整によって決定されました。関数を +1 で変換するには、2 つの定義で
x+1
を単に置き換えました。(これによって何を意味しているのかよくわかりませんでしたが、Stata グラフから判断しました。)x
addplot
ドメインを のオプションとして設定するのではなく
axis
、 の別の引数として指定することができます。そこで、と を2 つのプロット関数にaddplot
追加したので、1 本の線だけが表示されます。(軸のシフトに対応するために +1 だけ変換されていることに注意してください。)domain=0:1
domain=1:5
black
両方のコマンドに引数を追加しますaddplot
。
また、\draw
軸ラベルを配置および回転するための 2 つのコマンドも追加しました。(これもほとんど目視で行いますが、もっと良い方法があると思います。)
答え3
解決策はヒューゴブベリからだけでなくアレックスwlchanどちらも区分関数を区分的に描画するという欠点があり、一般的にいくつかの欠点としては
- プロットに複数の関数を描画する必要がある場合や、
- スタイルを追跡する必要があります。
(以下より拝借)JM114516。
区分関数の 2 つの関数部分はわかっていても、交点がどこにあるかがわからない場合は、関数max
(この場合は) を使用して、1 つのコマンドで関数を描画することができます\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}