I have a pandas pivot_table that I am plotting using matplotlib and I am trying to also plot a vertical line at a certain x coordinate. The interesting thing is I'm able to plot a horizontal line at a y coordinate without problem, doing the same for a vertical line plot is not working.
Panda pivot_table looks like the following...
Call Gamma Put Gamma
Strike
340.0 8.630821e 05 -2.908180e 07
345.0 3.740602e 05 -1.297854e 07
350.0 2.680039e 06 -3.798996e 07
355.0 1.733369e 06 -2.307662e 07
360.0 1.858877e 06 -2.335522e 07
365.0 2.475191e 06 -1.556776e 07
370.0 5.372839e 06 -6.969699e 07
372.0 2.453191e 06 -6.744016e 06
374.0 1.359576e 06 -4.797525e 06
375.0 1.258569e 07 -1.027296e 08
376.0 6.172461e 06 -6.335903e 07
377.0 6.433579e 06 -7.752972e 07
378.0 7.030789e 06 -1.727623e 08
379.0 4.256927e 06 -1.307386e 08
Here is the code I'm using to plot the pivot_table...
ax = mypivot.plot(figsize=(20, 5), kind='bar', stacked=True, title=name)
Here is the result of the above plot...
Now when I try to plot an additional vertical and horizontal line on top of the current figure, only the horizontal line works, here is the full code block...
ax = pivot.plot(figsize=(20, 5), kind='bar', stacked=True, title=name)
ax.axhline(y=-400000000, color='red')
ax.axvline(x=385, color='red')
I have a suspicion it's something to do with the Strike column in my pivot_table and indexing, but I can't figure it out for the life of me...please help...
Thanks!
CodePudding user response:
The standard way to add vertical lines that will cover your entire plot window without you having to specify their actual height is plt.axvline
import matplotlib.pyplot as plt
plt.axvline(x=0.22058956)
plt.axvline(x=0.33088437)
plt.axvline(x=2.20589566)
OR
xcoords = [0.22058956, 0.33088437, 2.20589566]
for xc in xcoords:
plt.axvline(x=xc)
You can use many of the keywords available for other plot commands (e.g. color, linestyle, linewidth ...). You can pass in keyword arguments ymin and ymax if you like in axes corrdinates (e.g. ymin=0.25, ymax=0.75 will cover the middle half of the plot). There are corresponding functions for horizontal lines (axhline) and rectangles (axvspan).
CodePudding user response:
Here, the pandas bar plot uses a categorical x-axis, internally numbering the bars 0, 1, 2, ...
. To add a line at the position of the bar with label 385.0
, you need to find the position of that bar, e.g. ax.axvline(x=19)
. You can use numpy's np.argmin
on the index column to find that position.
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
mypivot = pd.DataFrame({'Strike': np.arange(340, 436, 5),
'Call Gamma': 1e8 ** np.random.rand(20),
'Put Gamma': -1e8 ** np.random.rand(20)
}).set_index('Strike')
ax = mypivot.plot(figsize=(20, 5), kind='bar', stacked=True, color=['cornflowerblue', 'salmon'])
ax.axhline(-40000000, color='red')
ax.axvline(np.argmin(np.abs(mypivot.index - 385)), color='red')
plt.tight_layout()
plt.show()