This looks like it's fairly close to the answer I'm looking for but it's not quite there. Perhaps I'm not following the "tidy data" principles and will need to make a dataframe evaluated at many points to plot these functions but I'm hesitant to accept that as the answer.
Here's the code to plot the graph I have.
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()
But there's no legend... And I'd like there to be one.
(Although I'm in python, R users will likely have good suggestions)