Как правильно построить множественную лямбда-функцию в plotnine, чтобы появилась легенда? - PullRequest
0 голосов
/ 20 апреля 2020

Это выглядит так, как будто оно довольно близко к ответу, который я ищу, но не совсем там. Возможно, я не следую принципам «аккуратных данных», и мне нужно будет сделать оценку данных во многих точках для построения этих функций, но я не решаюсь принять это как ответ.

Вот код для построения график, который у меня есть.

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()

Но легенды нет ... И я бы хотел, чтобы она была.

(Хотя я в python, пользователи R будут скорее всего есть хорошие предложения)

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Построение нескольких функций на одном графике и наличие легенды для каждой функции невозможно. Для stat_function, func является параметром, а не эстети c, поэтому вы не можете сопоставить переменную / столбец с ним. Легенды только помогают интерпретировать отображения aestheti c.

Поскольку вы хотите выполнять много сложных вычислений, делайте это вне вызовов при построении, а затем выводите результаты с помощью geom_line. Убедитесь, что ваш фрейм данных находится в форме аккуратные данные . Не позволяйте тому факту, что существует stat_function, заставляющее вас использовать его, когда это не лучший инструмент для работы.

1 голос
/ 20 апреля 2020

В R, чтобы построить функции с пакетом ggplot2, сначала определите набор данных с вектором x. Затем используйте stat_function с соответствующим geom. Обычно это один из

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

Тогда очень просто построить график функции.

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

...