Esto parece que está bastante cerca de la respuesta que estoy buscando, pero no está allí. Quizás no estoy siguiendo los principios de "datos ordenados" y necesitaré hacer un marco de datos evaluado en muchos puntos para trazar estas funciones, pero dudo en aceptarlo como respuesta.

Aquí está el código para trazar el gráfico que tengo.

call_value_per_unit = lambda s_t1,X: max(0, s_t1-X)
put_value_per_unit = lambda s_t1, X: max(0, X-s_t1)
put_call_value = lambda s_t1, X: put_value_per_unit(s_t1, X) + call_value_per_unit(s_t1, X)

independent_variable = "Stock Price"
dependent_variable = "Asset Price"

g = ggplot(pd.DataFrame({independent_variable:[10,20]}), aes(x=independent_variable)) \
         + stat_function(fun=put_value_per_unit, args=[15], color="red") \
         + stat_function(fun=call_value_per_unit, args=[15], color="blue") \
         + stat_function(fun=put_call_value, args=[15], color="black") \
         + ylab(dependent_variable) \
         + ggtitle(" ".join([independent_variable , "vs", dependent_variable]))
_ = g.draw()

Pero no hay leyenda ... Y me gustaría que hubiera una.

(Aunque estoy en Python, los usuarios de R probablemente tendrán buenas sugerencias)

0
financial_physician 20 abr. 2020 a las 11:18

2 respuestas

La mejor respuesta

No es posible trazar varias funciones en una sola trama y tener una leyenda para cada función. Para stat_function, func es un parámetro, no una estética, por lo que no puede asignarle una variable / columna. Las leyendas solo ayudan a interpretar los mapeos estéticos.

Como desea hacer muchos cálculos pesados, hágalo fuera de las llamadas de trazado y luego trace los resultados con geom_line. Asegúrese de que su marco de datos esté en datos ordenados. No permita que el hecho de que haya un stat_function lo obligue a utilizarlo cuando no sea la mejor herramienta para el trabajo.

1
has2k1 20 abr. 2020 a las 14:32

En R, para trazar funciones con el paquete ggplot2, primero defina un conjunto de datos con un vector x. Luego use stat_function con un geom apropiado. Esto generalmente es uno de

  • geom = "line"
  • geom = "point"

Entonces, es muy simple graficar la función.

library(ggplot2)

df1 <- data.frame(x = -5:5)

ggplot(df1, aes(x)) +
  stat_function(geom = "line", fun = function(x) x^2)

enter image description here

1
Rui Barradas 20 abr. 2020 a las 11:29