Estou escrevendo minha tese em economia comportamental e preciso desenhar funções de desconto individuais, fiz o gráfico a seguir com stata, mas adoraria tê-lo com tikz.
Eu brinquei no tikz e consegui isso até agora:
\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}
o que leva a esta saída:
Infelizmente meu prazo é muito próximo. Alguém poderia me ajudar com as seguintes correções?
o intervalo do eixo y deve ser de 0 a 1.
o intervalo do eixo x deve ser de 0 a 5, E o valor x mostrado deve ser o valor verdadeiro da função +1.
as funções não devem se cruzar, basta tocar, ou seja
\addplot+[mark=none] {1-(1-0.7*0.8)*(x+1)};
de x=-1 a 0 (valores mostrados: 0 a 1)
\addplot+[mark=none] {0.7*0.8^(x+1)};
de x = 0 a 4 (valores mostrados: 1 a 5)
- Ambas as funções deverão ter a mesma cor (preto).
Responder1
Você pode simplesmente adicionar a especificação do domínio a cada função para restringir a parte mostrada da função. Para exibir valores diferentes no eixo x, basta deslocá-lo um para a direita, removendo o +1
da sua função. A especificação de cor pode ser adicionada para \addplot
definir tudo como preto e, finalmente, se você quiser ter certeza de que nenhum dado fora do domínio y 0:1 será exibido, use restrict y to domain=0:1
.
Editar:o eixo adicionado rotula a maneira pgfplots.
Editar 2:Adicionado segundo enredo e legenda. Observe que \addlegendentry
simplesmente adiciona entradas na ordem do \addplots
e vê as duas partes como gráficos separados, então a maneira mais fácil é primeiro plotar todas as primeiras partes de cada gráfico, configurar a legenda e, em seguida, plotar a segunda parte de cada gráfico .
\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}
Responder2
Aqui está o código:
\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}
e a saída:
O que eu fiz:
Adicionadas as chaves
ymin
eymax
aoaxis
ambiente: estas definem os limites dosim-eixo. Adicionei uma pequena quantidade de preenchimento para corresponder ao gráfico Stata, mas você pode facilmente defini-los exatamente como 0 e 1, se preferir.Adicionadas as chaves
xmin
exmax
para definir os limites dox-eixo. O preenchimento horizontal extra foi determinado principalmente a olho nu e por ajustes.Para traduzir a função por +1, simplesmente substituí
x+1
porx
nas duasaddplot
definições. (Eu não tinha certeza do que você quis dizer com isso, mas julguei pelo gráfico do Stata.)Em vez de definir o domínio como uma opção para
axis
, você pode fornecê-lo como um argumento separado paraaddplot
. Então adicioneidomain=0:1
edomain=1:5
às duas funções de plotagem, para que você obtenha apenas uma linha. (Observe a translação em +1 para acomodar a mudança do eixo.)Adicione o argumento
black
a ambosaddplot
os comandos.
Também adicionei dois \draw
comandos para posicionar e girar os rótulos dos eixos. (Novamente, principalmente feito a olho nu, embora eu ache que há uma maneira melhor de fazer isso.)
Responder3
A solução dehugovdbergbem como dealexwlchantêm a desvantagem de que ambos desenham a função por partes, que temem geralalgumas desvantagens como
- problemas de legenda quando você precisa desenhar mais de uma função em um gráfico ou
- é preciso acompanhar os estilos.
(Peguei emprestado deJM114516.)
Se você conhece as duas partes da função por partes, mas não sabe onde está o ponto de intersecção, você pode simplesmente usar a max
função (neste caso) para desenhar a função em um \addplot
comando...
\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}