0

I have the following dataframe, containing the mean and standard deviations of data, as well as other descriptors.

{'Person': {0: 'Mark',
  1: 'Mark',
  2: 'Mark',
  3: 'Mark',
  4: 'Mark',
  5: 'Mark',
  6: 'Mark',
  7: 'Mark',
  8: 'Mark',
  9: 'Mark',
  10: 'Mark',
  11: 'Mark',
  12: 'Mark',
  13: 'Mark',
  14: 'Mark',
  15: 'Mark',
  16: 'Mark',
  17: 'Mark',
  18: 'Mark',
  19: 'Mark',
  20: 'Mark',
  21: 'Mark',
  22: 'John',
  23: 'John',
  24: 'John',
  25: 'John',
  26: 'John',
  27: 'John',
  28: 'John',
  29: 'John',
  30: 'John',
  31: 'John',
  32: 'John',
  33: 'John',
  34: 'John',
  35: 'John',
  36: 'John',
  37: 'John',
  38: 'John',
  39: 'John',
  40: 'John',
  41: 'John',
  42: 'John',
  43: 'John'},
 'Alcohol': {0: 'No',
  1: 'No',
  2: 'No',
  3: 'No',
  4: 'No',
  5: 'No',
  6: 'No',
  7: 'No',
  8: 'No',
  9: 'No',
  10: 'No',
  11: 'Yes',
  12: 'Yes',
  13: 'Yes',
  14: 'Yes',
  15: 'Yes',
  16: 'Yes',
  17: 'Yes',
  18: 'Yes',
  19: 'Yes',
  20: 'Yes',
  21: 'Yes',
  22: 'No',
  23: 'No',
  24: 'No',
  25: 'No',
  26: 'No',
  27: 'No',
  28: 'No',
  29: 'No',
  30: 'No',
  31: 'No',
  32: 'No',
  33: 'Yes',
  34: 'Yes',
  35: 'Yes',
  36: 'Yes',
  37: 'Yes',
  38: 'Yes',
  39: 'Yes',
  40: 'Yes',
  41: 'Yes',
  42: 'Yes',
  43: 'Yes'},
 'Product': {0: 'Orange',
  1: 'Orange',
  2: 'Orange',
  3: 'Orange',
  4: 'Orange',
  5: 'Apple',
  6: 'Apple',
  7: 'Apple',
  8: 'Apple',
  9: 'Apple',
  10: 'Apple',
  11: 'Orange',
  12: 'Orange',
  13: 'Orange',
  14: 'Orange',
  15: 'Orange',
  16: 'Apple',
  17: 'Apple',
  18: 'Apple',
  19: 'Apple',
  20: 'Apple',
  21: 'Apple',
  22: 'Orange',
  23: 'Orange',
  24: 'Orange',
  25: 'Orange',
  26: 'Orange',
  27: 'Apple',
  28: 'Apple',
  29: 'Apple',
  30: 'Apple',
  31: 'Apple',
  32: 'Apple',
  33: 'Orange',
  34: 'Orange',
  35: 'Orange',
  36: 'Orange',
  37: 'Orange',
  38: 'Apple',
  39: 'Apple',
  40: 'Apple',
  41: 'Apple',
  42: 'Apple',
  43: 'Apple'},
 'Concentration': {0: 0,
  1: 10,
  2: 20,
  3: 30,
  4: 40,
  5: 0,
  6: 10,
  7: 20,
  8: 30,
  9: 40,
  10: 50,
  11: 0,
  12: 10,
  13: 20,
  14: 30,
  15: 40,
  16: 0,
  17: 10,
  18: 20,
  19: 30,
  20: 40,
  21: 50,
  22: 0,
  23: 10,
  24: 20,
  25: 30,
  26: 40,
  27: 0,
  28: 10,
  29: 20,
  30: 30,
  31: 40,
  32: 50,
  33: 0,
  34: 10,
  35: 20,
  36: 30,
  37: 40,
  38: 0,
  39: 10,
  40: 20,
  41: 30,
  42: 40,
  43: 50},
 'Response': {0: 4,
  1: 10,
  2: 25,
  3: 31,
  4: 48,
  5: 10,
  6: 22,
  7: 35,
  8: 46,
  9: 56,
  10: 61,
  11: 24,
  12: 30,
  13: 45,
  14: 51,
  15: 68,
  16: 30,
  17: 42,
  18: 55,
  19: 66,
  20: 76,
  21: 81,
  22: 17,
  23: 23,
  24: 38,
  25: 44,
  26: 61,
  27: 23,
  28: 35,
  29: 48,
  30: 59,
  31: 69,
  32: 74,
  33: 37,
  34: 43,
  35: 58,
  36: 64,
  37: 81,
  38: 43,
  39: 55,
  40: 68,
  41: 79,
  42: 89,
  43: 94},
 'Response mean': {0: 4.333333333,
  1: 15.0,
  2: 24.33333333,
  3: 35.33333333,
  4: 45.33333333,
  5: 12.33333333,
  6: 24.66666667,
  7: 34.33333333,
  8: 45.0,
  9: 57.66666667,
  10: 55.66666667,
  11: 24.33333333,
  12: 35.0,
  13: 44.33333333,
  14: 55.33333333,
  15: 65.33333333,
  16: 32.33333333,
  17: 44.66666667,
  18: 54.33333333,
  19: 65.0,
  20: 77.66666667,
  21: 75.66666667,
  22: 17.33333333,
  23: 28.0,
  24: 37.33333333,
  25: 48.33333333,
  26: 58.33333333,
  27: 25.33333333,
  28: 37.66666667,
  29: 47.33333333,
  30: 58.0,
  31: 70.66666667,
  32: 68.66666667,
  33: 37.33333333,
  34: 48.0,
  35: 57.33333333,
  36: 68.33333333,
  37: 78.33333333,
  38: 45.33333333,
  39: 57.66666667,
  40: 67.33333333,
  41: 78.0,
  42: 90.66666667,
  43: 88.66666667},
 'Response SD': {0: 1.527525232,
  1: 4.582575695,
  2: 2.081665999,
  3: 4.041451884,
  4: 2.516611478,
  5: 2.516611478,
  6: 3.055050463,
  7: 2.081665999,
  8: 1.0,
  9: 1.527525232,
  10: 14.74222959,
  11: 1.527525232,
  12: 4.582575695,
  13: 2.081665999,
  14: 4.041451884,
  15: 2.516611478,
  16: 2.516611478,
  17: 3.055050463,
  18: 2.081665999,
  19: 1.0,
  20: 1.527525232,
  21: 14.74222959,
  22: 1.527525232,
  23: 4.582575695,
  24: 2.081665999,
  25: 4.041451884,
  26: 2.516611478,
  27: 2.516611478,
  28: 3.055050463,
  29: 2.081665999,
  30: 1.0,
  31: 1.527525232,
  32: 14.74222959,
  33: 1.527525232,
  34: 4.582575695,
  35: 2.081665999,
  36: 4.041451884,
  37: 2.516611478,
  38: 2.516611478,
  39: 3.055050463,
  40: 2.081665999,
  41: 1.0,
  42: 1.527525232,
  43: 14.74222959}}

I've starting using hvplot because of the interactivity it offers to explore data, and from what I can tell, its based on Bokeh. In the example code below, I can plot the mean values (using scatter to give me the glyphs) and the line through the glyphs (using line) and overlaying them with the scatter * line code. However, as I need to plot the standard deviations, I'm using the errorbar plot too, which works great (note that I use scatter * line * error). However, when I click on the legend to remove certain data, the scatter and line is removed (note that I have muted_alpha=0 for the line and scatter, but there is no such option for the error bars), but the error bars stay on the plot. Its as though the scatter and line are 'linked' together, but the errorbars isn't.

line = df2.hvplot.line(x='Concentration', y='Response mean', by='Product', groupby= ['Person', 'Alcohol'], muted_alpha=0)
scatter = df2.hvplot.scatter(x='Concentration', y='Response mean', by='Product', groupby=['Person', 'Alcohol'], marker='o', size=40, muted_alpha=0)
error = df2.hvplot.errorbars(x='Concentration', y='Response mean', yerr1='Response SD', by='Product', groupby=['Person', 'Alcohol'])

all_plots = scatter * line * error
all_plots

Can anyone help me to link the errorbars to its corresponding data, so when I click on the legend, the error bars, scatter and line are removed from the plot?

Thank you in advance!

  • As far as I see this is not possible, because `errorbars` is based [`Whisker`](https://docs.bokeh.org/en/latest/docs/reference/models/annotations.html?#bokeh.models.Whisker) and this is an annotation. In [Bokeh Issue #9955](https://github.com/bokeh/bokeh/issues/9955) the wish `Allow annotations to be added to legends (this has come up several times recently)` is documented but it is still work in progess. – mosc9575 Oct 18 '22 at 08:14
  • Thank you so much for your help! I guess there isn't a work around? – Steve..Johnson Oct 18 '22 at 17:15
  • There is a workaround I know (using bokeh), plotting Whiskers as a combination of [`rect`](https://docs.bokeh.org/en/latest/docs/reference/plotting/figure.html?highlight=rect#bokeh.plotting.Figure.rect) with the correspondent `legend_label` in a loop. But I don't know if the `*`-syntax of `hvplot` will work. Please see [this post](https://stackoverflow.com/questions/74034869/creating-a-boxplot-using-bokeh/74044034#74044034) to see a whiskers demonstration. – mosc9575 Oct 18 '22 at 19:06

0 Answers0