조각별 함수에 대한 그래프를 어떻게 생성할 수 있나요?

조각별 함수에 대한 그래프를 어떻게 생성할 수 있나요?

저는 행동경제학에 대한 논문을 작성 중이고 개별 할인 함수를 그려야 합니다. 다음 그래프는 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}

이는 다음과 같은 출력으로 이어집니다.

두 개의 선이 있는 선형 그래프의 스크린샷

슬프게도 마감일이 곧 다가옵니다. 누구든지 다음 수정 사항을 도와줄 수 있나요?

  1. y축의 범위는 0에서 1 사이여야 합니다.

  2. x축의 범위는 0에서 5 사이여야 하며 표시된 x값은 함수 +1의 실제 값이어야 합니다.

  3. 기능이 교차되어서는 안 됩니다. 즉, 터치만 하면 됩니다.

     \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. 두 기능 모두 동일한 색상(검은색)을 가져야 합니다.

답변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}

출력은 다음과 같습니다.

여기에 이미지 설명을 입력하세요

내가 한 것:

  1. ymin와 환경 ymax을 추가했습니다 axis. 이는 키의 한계를 설정합니다.와이-중심선. Stata 그래프와 일치하도록 약간의 패딩을 추가했지만 원하는 경우 이를 정확히 0과 1로 쉽게 설정할 수 있습니다.

  2. 키를 추가 xmin하고 xmax제한을 설정했습니다.엑스-중심선. 추가 수평 패딩은 주로 눈과 조정을 통해 결정되었습니다.

    함수를 +1로 번역하려면 두 정의에서 간단히 x+1로 바꾸었습니다 . (무슨 말씀이신지 잘 모르겠지만 Stata 그래프를 보고 판단했습니다.)xaddplot

  3. 도메인을 에 대한 옵션으로 설정하는 대신 axis에 별도의 인수로 제공할 수 있습니다 addplot. 그래서 두 개의 플로팅 함수에 domain=0:1및를 추가하여 domain=1:5한 줄만 얻습니다. (축 이동을 수용하기 위해 +1로 변환합니다.)

  4. 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}

위 코드의 결과를 보여주는 이미지

관련 정보