저는 행동경제학에 대한 논문을 작성 중이고 개별 할인 함수를 그려야 합니다. 다음 그래프는 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
함수에서 를 제거하여 x축을 오른쪽으로 하나씩 이동하면 됩니다. 색상 사양을 에 추가하여 \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
제한을 설정했습니다.엑스-중심선. 추가 수평 패딩은 주로 눈과 조정을 통해 결정되었습니다.함수를 +1로 번역하려면 두 정의에서 간단히
x+1
로 바꾸었습니다 . (무슨 말씀이신지 잘 모르겠지만 Stata 그래프를 보고 판단했습니다.)x
addplot
도메인을 에 대한 옵션으로 설정하는 대신
axis
에 별도의 인수로 제공할 수 있습니다addplot
. 그래서 두 개의 플로팅 함수에domain=0:1
및를 추가하여domain=1:5
한 줄만 얻습니다. (축 이동을 수용하기 위해 +1로 변환합니다.)black
두 명령 모두에 인수를 추가합니다addplot
.
\draw
또한 축 레이블을 배치하고 회전하는 두 가지 명령을 추가했습니다 . (다시 말하지만, 더 좋은 방법이 있을 것 같지만 대부분은 눈으로 수행됩니다.)
답변3
의 솔루션휴고브베리뿐만 아니라알렉산찬둘 다 조각별 함수를 조각별로 그리는 단점이 있습니다.일반적으로같은 몇 가지 단점
- 플롯에서 둘 이상의 함수를 그려야 할 때 범례 문제가 발생하거나
- 스타일을 추적해야합니다.
(이것들은 다음에서 빌려왔습니다.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}