I currently have a plot like this (consider that data
is the dataframe I pasted at the very bottom):
import seaborn as sns sns.relplot( data = data, x = "Threshold", y = "Value", kind = "line", hue="Metric" ).set(xlabel="Threshold")
Which produces:
Now, I want to know how can I annotate a line in this plot, such that it is located between the curves, at the x-Axis value where the distance between curves are maximized. I would also need to annotate text to show the distance value.
It should be something like this:
Here is the pandas dataframe:
Threshold,Metric,Value 0.0,Recall,1.0 0.010101010101010102,Recall,0.9802536231884058 0.020202020202020204,Recall,0.9706521739130435 0.030303030303030304,Recall,0.9621376811594203 0.04040404040404041,Recall,0.9541666666666667 0.05050505050505051,Recall,0.9456521739130435 0.06060606060606061,Recall,0.9322463768115942 0.07070707070707072,Recall,0.9173913043478261 0.08080808080808081,Recall,0.908695652173913 0.09090909090909091,Recall,0.8976449275362319 0.10101010101010102,Recall,0.8813405797101449 0.11111111111111112,Recall,0.8644927536231884 0.12121212121212122,Recall,0.8498188405797101 0.13131313131313133,Recall,0.8358695652173913 0.14141414141414144,Recall,0.818659420289855 0.15151515151515152,Recall,0.7967391304347826 0.16161616161616163,Recall,0.7748188405797102 0.17171717171717174,Recall,0.7521739130434782 0.18181818181818182,Recall,0.7269927536231884 0.19191919191919193,Recall,0.6952898550724638 0.20202020202020204,Recall,0.6704710144927536 0.21212121212121213,Recall,0.648731884057971 0.22222222222222224,Recall,0.6097826086956522 0.23232323232323235,Recall,0.5847826086956521 0.24242424242424243,Recall,0.5521739130434783 0.25252525252525254,Recall,0.5023550724637681 0.26262626262626265,Recall,0.4766304347826087 0.27272727272727276,Recall,0.42047101449275365 0.2828282828282829,Recall,0.3958333333333333 0.29292929292929293,Recall,0.3539855072463768 0.30303030303030304,Recall,0.3327898550724638 0.31313131313131315,Recall,0.3036231884057971 0.32323232323232326,Recall,0.2798913043478261 0.33333333333333337,Recall,0.2371376811594203 0.3434343434343435,Recall,0.22119565217391304 0.3535353535353536,Recall,0.17300724637681159 0.36363636363636365,Recall,0.15996376811594204 0.37373737373737376,Recall,0.13568840579710145 0.38383838383838387,Recall,0.11938405797101449 0.393939393939394,Recall,0.10652173913043478 0.4040404040404041,Recall,0.09891304347826087 0.4141414141414142,Recall,0.08894927536231884 0.42424242424242425,Recall,0.07681159420289856 0.43434343434343436,Recall,0.06557971014492754 0.4444444444444445,Recall,0.05253623188405797 0.4545454545454546,Recall,0.04655797101449275 0.4646464646464647,Recall,0.024456521739130436 0.4747474747474748,Recall,0.019384057971014494 0.48484848484848486,Recall,0.009782608695652175 0.494949494949495,Recall,0.0034420289855072463 0.5050505050505051,Recall,0.002173913043478261 0.5151515151515152,Recall,0.0016304347826086956 0.5252525252525253,Recall,0.0007246376811594203 0.5353535353535354,Recall,0.00018115942028985507 0.5454545454545455,Recall,0.0 0.5555555555555556,Recall,0.0 0.5656565656565657,Recall,0.0 0.5757575757575758,Recall,0.0 0.5858585858585859,Recall,0.0 0.595959595959596,Recall,0.0 0.6060606060606061,Recall,0.0 0.6161616161616162,Recall,0.0 0.6262626262626263,Recall,0.0 0.6363636363636365,Recall,0.0 0.6464646464646465,Recall,0.0 0.6565656565656566,Recall,0.0 0.6666666666666667,Recall,0.0 0.6767676767676768,Recall,0.0 0.686868686868687,Recall,0.0 0.696969696969697,Recall,0.0 0.7070707070707072,Recall,0.0 0.7171717171717172,Recall,0.0 0.7272727272727273,Recall,0.0 0.7373737373737375,Recall,0.0 0.7474747474747475,Recall,0.0 0.7575757575757577,Recall,0.0 0.7676767676767677,Recall,0.0 0.7777777777777778,Recall,0.0 0.787878787878788,Recall,0.0 0.797979797979798,Recall,0.0 0.8080808080808082,Recall,0.0 0.8181818181818182,Recall,0.0 0.8282828282828284,Recall,0.0 0.8383838383838385,Recall,0.0 0.8484848484848485,Recall,0.0 0.8585858585858587,Recall,0.0 0.8686868686868687,Recall,0.0 0.8787878787878789,Recall,0.0 0.888888888888889,Recall,0.0 0.8989898989898991,Recall,0.0 0.9090909090909092,Recall,0.0 0.9191919191919192,Recall,0.0 0.9292929292929294,Recall,0.0 0.9393939393939394,Recall,0.0 0.9494949494949496,Recall,0.0 0.9595959595959597,Recall,0.0 0.9696969696969697,Recall,0.0 0.9797979797979799,Recall,0.0 0.98989898989899,Recall,0.0 1.0,Recall,0.0 0.0,Fall-out,1.0 0.010101010101010102,Fall-out,0.6990465720990212 0.020202020202020204,Fall-out,0.58461408367334 0.030303030303030304,Fall-out,0.516647992727734 0.04040404040404041,Fall-out,0.4643680104855929 0.05050505050505051,Fall-out,0.4172674037587468 0.06060606060606061,Fall-out,0.3796376551170116 0.07070707070707072,Fall-out,0.3507811343889394 0.08080808080808081,Fall-out,0.33186055852694335 0.09090909090909091,Fall-out,0.3152231359533222 0.10101010101010102,Fall-out,0.29964272879098575 0.11111111111111112,Fall-out,0.2855844238208993 0.12121212121212122,Fall-out,0.27161068008371564 0.13131313131313133,Fall-out,0.25719298987379235 0.14141414141414144,Fall-out,0.24338836860241422 0.15151515151515152,Fall-out,0.2312538316808659 0.16161616161616163,Fall-out,0.22026087140350506 0.17171717171717174,Fall-out,0.2083377375642137 0.18181818181818182,Fall-out,0.19694311143056467 0.19191919191919193,Fall-out,0.18402638310466565 0.20202020202020204,Fall-out,0.17440754286197493 0.21212121212121213,Fall-out,0.16548633279073208 0.22222222222222224,Fall-out,0.15278100754709004 0.23232323232323235,Fall-out,0.14292962391391667 0.24242424242424243,Fall-out,0.1317252605542989 0.25252525252525254,Fall-out,0.11555292476164303 0.26262626262626265,Fall-out,0.10612434729298353 0.27272727272727276,Fall-out,0.08902183793839714 0.2828282828282829,Fall-out,0.08331395471745978 0.29292929292929293,Fall-out,0.07232099444009894 0.30303030303030304,Fall-out,0.06735302200706086 0.31313131313131315,Fall-out,0.061454876012092256 0.32323232323232326,Fall-out,0.05665602604485973 0.33333333333333337,Fall-out,0.048982094158932836 0.3434343434343435,Fall-out,0.045641925459273196 0.3535353535353536,Fall-out,0.03748176648415534 0.36363636363636365,Fall-out,0.0341415977844957 0.37373737373737376,Fall-out,0.029321607509037482 0.38383838383838387,Fall-out,0.026996173604211148 0.393939393939394,Fall-out,0.024353635075999407 0.4040404040404041,Fall-out,0.022514428260364035 0.4141414141414142,Fall-out,0.01940680295118703 0.42424242424242425,Fall-out,0.017165930279263473 0.43434343434343436,Fall-out,0.014459970826374648 0.4444444444444445,Fall-out,0.011035240893812233 0.4545454545454546,Fall-out,0.009386296852208105 0.4646464646464647,Fall-out,0.004756569350781135 0.4747474747474748,Fall-out,0.003868676405301989 0.48484848484848486,Fall-out,0.002135171130795087 0.494949494949495,Fall-out,0.0008033317125763693 0.5050505050505051,Fall-out,0.0004228061645138786 0.5151515151515152,Fall-out,0.00031710462338540896 0.5252525252525253,Fall-out,4.228061645138786e-05 0.5353535353535354,Fall-out,0.0 0.5454545454545455,Fall-out,0.0 0.5555555555555556,Fall-out,0.0 0.5656565656565657,Fall-out,0.0 0.5757575757575758,Fall-out,0.0 0.5858585858585859,Fall-out,0.0 0.595959595959596,Fall-out,0.0 0.6060606060606061,Fall-out,0.0 0.6161616161616162,Fall-out,0.0 0.6262626262626263,Fall-out,0.0 0.6363636363636365,Fall-out,0.0 0.6464646464646465,Fall-out,0.0 0.6565656565656566,Fall-out,0.0 0.6666666666666667,Fall-out,0.0 0.6767676767676768,Fall-out,0.0 0.686868686868687,Fall-out,0.0 0.696969696969697,Fall-out,0.0 0.7070707070707072,Fall-out,0.0 0.7171717171717172,Fall-out,0.0 0.7272727272727273,Fall-out,0.0 0.7373737373737375,Fall-out,0.0 0.7474747474747475,Fall-out,0.0 0.7575757575757577,Fall-out,0.0 0.7676767676767677,Fall-out,0.0 0.7777777777777778,Fall-out,0.0 0.787878787878788,Fall-out,0.0 0.797979797979798,Fall-out,0.0 0.8080808080808082,Fall-out,0.0 0.8181818181818182,Fall-out,0.0 0.8282828282828284,Fall-out,0.0 0.8383838383838385,Fall-out,0.0 0.8484848484848485,Fall-out,0.0 0.8585858585858587,Fall-out,0.0 0.8686868686868687,Fall-out,0.0 0.8787878787878789,Fall-out,0.0 0.888888888888889,Fall-out,0.0 0.8989898989898991,Fall-out,0.0 0.9090909090909092,Fall-out,0.0 0.9191919191919192,Fall-out,0.0 0.9292929292929294,Fall-out,0.0 0.9393939393939394,Fall-out,0.0 0.9494949494949496,Fall-out,0.0 0.9595959595959597,Fall-out,0.0 0.9696969696969697,Fall-out,0.0 0.9797979797979799,Fall-out,0.0 0.98989898989899,Fall-out,0.0 1.0,Fall-out,0.0
Advertisement
Answer
- Use
pivot
to transform the data from long to wide - Use
idxmax
to find thex
(Threshold) of the max difference betweeny1
andy2
(Fall-out and Recall) - Use
vlines
to plot the vertical line atx
fromy1
toy2
- Use
annotate
to plot the label at the midpoint ofy1
andy2
g = sns.relplot(data=data, x='Threshold', y='Value', hue='Metric', kind='line') # pivot to wide form p = data.pivot(index='Threshold', columns='Metric', values='Value') # find x, y1, and y2 corresponding to max difference diff = p['Fall-out'].sub(p['Recall']).abs() x = diff.idxmax() y1, y2 = p.loc[x] # plot line and label ax = g.axes.flat[0] ax.vlines(x, y1, y2, ls='--') ax.annotate(f'Dist = {diff.loc[x]:.2f}', ha='left', va='center', xy=(x, 0.5*(y1+y2)), xycoords='data', xytext=(5, 0), textcoords='offset pixels')