Search code examples
pythonpandasplotplotlybar-chart

Using rows from DF as hoverdata in a plotly graph


I made this px.bar plot from a df of 28 rows by 300 columns. The 'Strain' represented the individual samples and then the rest of the columns are the variables in that particular sample.

data = {'Strain': {0: 'incub_1016',
  1: 'incub_1227',
  2: 'incub_1228',
  3: 'incub_1230',
  4: 'incub_1233',
  5: 'incub_1235',
  6: 'incub_1238',
  7: 'incub_1239',
  8: 'incub_1244',
  9: 'incub_1255',
  10: 'incub_1260',
  11: 'incub_1262',
  12: 'incub_1263',
  13: 'incub_1297',
  14: 'incub_1630',
  15: 'incub_1732',
  16: 'incub_2101',
  17: 'incub_634',
  18: 'incub_730',
  19: 'incub_784',
  20: 'incub_AHU9424',
  21: 'incub_GiK1',
  22: 'incub_SAS405',
  23: 'annotation network number',
  24: 'retention time (min)',
  25: 'row m/z',
  26: 'row ID',
  27: 'adduct (ion identity)',
  28: 'neutral mass (ion identity)'},
 0: {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 45626.0,
  5: 61138.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  9: 0.0,
  10: 0.0,
  11: 0.0,
  12: 0.0,
  13: 0.0,
  14: 0.0,
  15: 0.0,
  16: 0.0,
  17: 0.0,
  18: 0.0,
  19: 0.0,
  20: 0.0,
  21: 0.0,
  22: 0.0,
  23: 0.0,
  24: 0.825,
  25: {253.07, 293.0633},
  26: '{1, 2}',
  27: "{'[M-H2O+H]+', '[M+Na]+'}",
  28: 270.07394},
 1: {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  5: 0.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  9: 0.0,
  10: 0.0,
  11: 0.0,
  12: 0.0,
  13: 0.0,
  14: 39856.0,
  15: 0.0,
  16: 0.0,
  17: 0.0,
  18: 0.0,
  19: 0.0,
  20: 0.0,
  21: 0.0,
  22: 23452.0,
  23: 1.0,
  24: 0.93,
  25: {771.2478, 793.2298},
  26: '{9, 10}',
  27: "{'[M+H]+', '[M+Na]+'}",
  28: 770.24056},
 2: {0: 89549.0,
  1: 61740.0,
  2: 70953.0,
  3: 1009036.0,
  4: 915043.0,
  5: 268206.0,
  6: 508191.0,
  7: 284849.0,
  8: 1039166.0,
  9: 93727.0,
  10: 16200.0,
  11: 177996.0,
  12: 85926.0,
  13: 0.0,
  14: 913501.0,
  15: 0.0,
  16: 0.0,
  17: 0.0,
  18: 98502.0,
  19: 0.0,
  20: 0.0,
  21: 0.0,
  22: 91080.0,
  23: 4.0,
  24: 1.34,
  25: {265.1432, 305.136, 587.2826},
  26: '{25, 26, 27}',
  27: "{'[2M+Na]+', '[M-H2O+H]+', '[M+Na]+'}",
  28: 282.14683},
 3: {0: 430466.0,
  1: 339729.0,
  2: 220069.0,
  3: 238829.0,
  4: 287711.0,
  5: 316194.0,
  6: 172840.0,
  7: 169638.0,
  8: 129705.0,
  9: 445204.0,
  10: 375693.0,
  11: 246708.0,
  12: 201585.0,
  13: 142085.0,
  14: 312694.0,
  15: 161958.0,
  16: 287455.0,
  17: 257876.0,
  18: 194061.0,
  19: 226707.0,
  20: 203649.0,
  21: 183741.0,
  22: 239926.0,
  23: 5.0,
  24: 1.37,
  25: {215.1431},
  26: '{44}',
  27: "{'[M-H2O+H]+'}",
  28: 232.14662},
 4: {0: 9433698.0,
  1: 7459427.0,
  2: 4768134.0,
  3: 5143362.0,
  4: 6458836.0,
  5: 6440897.0,
  6: 3500930.0,
  7: 3444983.0,
  8: 2650205.0,
  9: 10139207.0,
  10: 8655312.0,
  11: 5341100.0,
  12: 4506229.0,
  13: 3280253.0,
  14: 6770021.0,
  15: 3704129.0,
  16: 6064392.0,
  17: 5886656.0,
  18: 4240117.0,
  19: 4963099.0,
  20: 4623832.0,
  21: 4232354.0,
  22: 5433527.0,
  23: 6.0,
  24: 1.37,
  25: {233.1536, 329.1783},
  26: '{32, 46}',
  27: "{'[M+DMSO+H]+', '[M-H2O+H]+'}",
  28: 250.15717},
 5: {0: 11045184.0,
  1: 9396327.0,
  2: 7142265.0,
  3: 6505800.0,
  4: 7457517.0,
  5: 8245296.0,
  6: 4828589.0,
  7: 5487263.0,
  8: 3719185.0,
  9: 12251745.0,
  10: 11403435.0,
  11: 6825563.0,
  12: 5564660.0,
  13: 4905336.0,
  14: 8563499.0,
  15: 5605669.0,
  16: 8038377.0,
  17: 7907239.0,
  18: 6135822.0,
  19: 6920118.0,
  20: 6794400.0,
  21: 7433341.0,
  22: 6985700.0,
  23: 7.0,
  24: 1.37,
  25: {251.1642, 269.1749, 286.2013, 291.1567, 559.324},
  26: '{35, 37, 38, 39, 43}',
  27: "{'[2M+Na]+', '[M+H]+', '[M-H2O+H]+', '[M+NH4]+', '[M+Na]+'}",
  28: 268.1676},
 6: {0: 1930246.0,
  1: 1614646.0,
  2: 1224044.0,
  3: 1192983.0,
  4: 1347877.0,
  5: 1412026.0,
  6: 915319.0,
  7: 974165.0,
  8: 698909.0,
  9: 2074739.0,
  10: 1895785.0,
  11: 1211904.0,
  12: 943046.0,
  13: 741072.0,
  14: 1503547.0,
  15: 840021.0,
  16: 1320391.0,
  17: 1203124.0,
  18: 991559.0,
  19: 1167256.0,
  20: 1033043.0,
  21: 1058768.0,
  22: 1199289.0,
  23: 8.0,
  24: 1.37,
  25: {205.1587, 223.1693},
  26: '{40, 45}',
  27: "{'[M+H]+', '[M-H2O+H]+'}",
  28: 222.16229},
 7: {0: 150311.0,
  1: 92311.0,
  2: 213523.0,
  3: 361753.0,
  4: 373426.0,
  5: 511960.0,
  6: 260362.0,
  7: 178298.0,
  8: 377959.0,
  9: 47930.0,
  10: 0.0,
  11: 230438.0,
  12: 24470.0,
  13: 41380.0,
  14: 0.0,
  15: 139752.0,
  16: 25114.0,
  17: 0.0,
  18: 39291.0,
  19: 0.0,
  20: 204010.0,
  21: 134354.0,
  22: 114338.0,
  23: 9.0,
  24: 1.375,
  25: {201.1274, 219.1381},
  26: '{50, 28}',
  27: "{'[M+H]+', '[M-H2O+H]+'}",
  28: 218.13099},
 8: {0: 597020.0,
  1: 262780.0,
  2: 1047540.0,
  3: 307416.0,
  4: 0.0,
  5: 0.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  9: 129152.0,
  10: 0.0,
  11: 665404.0,
  12: 105004.0,
  13: 186484.0,
  14: 0.0,
  15: 708089.0,
  16: 0.0,
  17: 261455.0,
  18: 270555.0,
  19: 0.0,
  20: 909808.0,
  21: 505462.0,
  22: 767974.0,
  23: 10.0,
  24: 1.46,
  25: {231.138},
  26: '{56}',
  27: "{'[M-H2O+H]+'}",
  28: 248.14153},
 9: {0: 944071.0,
  1: 383550.0,
  2: 1451871.0,
  3: 464522.0,
  4: 0.0,
  5: 173399.0,
  6: 420100.0,
  7: 306671.0,
  8: 233738.0,
  9: 225107.0,
  10: 0.0,
  11: 1438880.0,
  12: 117421.0,
  13: 242607.0,
  14: 165271.0,
  15: 1061080.0,
  16: 177653.0,
  17: 192563.0,
  18: 526876.0,
  19: 0.0,
  20: 1338201.0,
  21: 931589.0,
  22: 1218056.0,
  23: 11.0,
  24: 1.46,
  25: {249.1486, 267.1592, 284.1857, 289.1411, 555.2932},
  26: '{57, 59, 61, 62, 63}',
  27: "{'[2M+Na]+', '[M+H]+', '[M-H2O+H]+', '[M+NH4]+', '[M+Na]+'}",
  28: 266.15201},
 10: {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  5: 193621.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  9: 0.0,
  10: 0.0,
  11: 0.0,
  12: 0.0,
  13: 0.0,
  14: 0.0,
  15: 0.0,
  16: 0.0,
  17: 0.0,
  18: 0.0,
  19: 0.0,
  20: 0.0,
  21: 0.0,
  22: 0.0,
  23: 12.0,
  24: 1.52,
  25: {344.2545, 366.2364},
  26: '{70, 71}',
  27: "{'[M+H]+', '[M+Na]+'}",
  28: 343.24719},
 11: {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  5: 0.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  9: 0.0,
  10: 0.0,
  11: 0.0,
  12: 0.0,
  13: 0.0,
  14: 822470.0,
  15: 0.0,
  16: 0.0,
  17: 0.0,
  18: 0.0,
  19: 0.0,
  20: 0.0,
  21: 0.0,
  22: 0.0,
  23: 13.0,
  24: 1.5266666666666666,
  25: {300.1805, 305.1361, 587.2829},
  26: '{73, 77, 69}',
  27: "{'[2M+Na]+', '[M+NH4]+', '[M+Na]+'}",
  28: 282.14679},
 12: {0: 3424332.0,
  1: 3837520.0,
  2: 3331768.0,
  3: 6917216.0,
  4: 6399089.0,
  5: 5007141.0,
  6: 6782264.0,
  7: 8085729.0,
  8: 7979350.0,
  9: 3285058.0,
  10: 0.0,
  11: 5853626.0,
  12: 4363960.0,
  13: 5716803.0,
  14: 7323522.0,
  15: 4652426.0,
  16: 0.0,
  17: 2748719.0,
  18: 3197540.0,
  19: 1535836.0,
  20: 3171135.0,
  21: 0.0,
  22: 3857165.0,
  23: 14.0,
  24: 1.58,
  25: {213.1273, 231.1379},
  26: '{76, 94}',
  27: "{'[M+H]+', '[M-H2O+H]+'}",
  28: 230.13087},
 13: {0: 6321702.0,
  1: 6976419.0,
  2: 5928510.0,
  3: 12720283.0,
  4: 11286563.0,
  5: 8460642.0,
  6: 12082640.0,
  7: 14763320.0,
  8: 14135460.0,
  9: 5683067.0,
  10: 0.0,
  11: 10419047.0,
  12: 7715883.0,
  13: 6774472.0,
  14: 12940088.0,
  15: 5728413.0,
  16: 0.0,
  17: 2511516.0,
  18: 5808180.0,
  19: 2545978.0,
  20: 4484358.0,
  21: 0.0,
  22: 7268231.0,
  23: 16.0,
  24: 1.6066666666666667,
  25: {249.1485, 267.1591, 284.1856, 289.141, 345.1732, 555.2925},
  26: '{87, 88, 89, 91, 93, 95}',
  27: "{'[M+DMSO+H]+', '[2M+Na]+', '[M+H]+', '[M-H2O+H]+', '[M+NH4]+', '[M+Na]+'}",
  28: 266.15188},
 14: {0: 1340776.0,
  1: 1433754.0,
  2: 1272536.0,
  3: 2599105.0,
  4: 2308814.0,
  5: 1940477.0,
  6: 2472482.0,
  7: 3069386.0,
  8: 2946943.0,
  9: 1187110.0,
  10: 572818.0,
  11: 2139380.0,
  12: 1630111.0,
  13: 1735297.0,
  14: 2675080.0,
  15: 1546371.0,
  16: 0.0,
  17: 830396.0,
  18: 1215791.0,
  19: 630765.0,
  20: 1099071.0,
  21: 0.0,
  22: 1496092.0,
  23: 17.0,
  24: 1.61,
  25: {203.143, 221.1537},
  26: '{90, 92}',
  27: "{'[M+H]+', '[M-H2O+H]+'}",
  28: 220.14658},
 15: {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 54051.0,
  5: 173175.0,
  6: 0.0,
  7: 0.0,
  8: 26801.0,
  9: 0.0,
  10: 0.0,
  11: 0.0,
  12: 0.0,
  13: 0.0,
  14: 0.0,
  15: 0.0,
  16: 0.0,
  17: 0.0,
  18: 0.0,
  19: 0.0,
  20: 0.0,
  21: 0.0,
  22: 0.0,
  23: 18.0,
  24: 1.63,
  25: {253.1432},
  26: '{99}',
  27: "{'[M-H2O+H]+'}",
  28: 270.14678},
 16: {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  5: 1002262.0,
  6: 0.0,
  7: 0.0,
  8: 62247.0,
  9: 0.0,
  10: 0.0,
  11: 0.0,
  12: 0.0,
  13: 46486.0,
  14: 0.0,
  15: 0.0,
  16: 0.0,
  17: 0.0,
  18: 0.0,
  19: 0.0,
  20: 0.0,
  21: 0.0,
  22: 0.0,
  23: 19.0,
  24: 1.6349999999999998,
  25: {271.1538, 311.1468},
  26: '{100, 102}',
  27: "{'[M-H2O+H]+', '[M+Na]+'}",
  28: 288.15757},
 17: {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  5: 0.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  9: 0.0,
  10: 0.0,
  11: 0.0,
  12: 14195.0,
  13: 0.0,
  14: 0.0,
  15: 0.0,
  16: 0.0,
  17: 0.0,
  18: 0.0,
  19: 0.0,
  20: 0.0,
  21: 0.0,
  22: 0.0,
  23: 21.0,
  24: 1.73,
  25: {322.2378, 340.2481},
  26: '{120, 119}',
  27: "{'[M+H]+', '[M-H2O+H]+'}",
  28: 339.24123},
 18: {0: 4151940.0,
  1: 3168271.0,
  2: 3542558.0,
  3: 3837368.0,
  4: 0.0,
  5: 3010259.0,
  6: 3945764.0,
  7: 5099517.0,
  8: 4772564.0,
  9: 2981016.0,
  10: 2317483.0,
  11: 4810564.0,
  12: 2999389.0,
  13: 5973016.0,
  14: 3879754.0,
  15: 7241427.0,
  16: 9348321.0,
  17: 15955418.0,
  18: 3029145.0,
  19: 2621519.0,
  20: 5229218.0,
  21: 2648685.0,
  22: 4069449.0,
  23: 22.0,
  24: 1.8516666666666668,
  25: {249.1485, 267.1591, 284.1856, 289.1409, 345.1726, 555.2926},
  26: '{129, 132, 133, 135, 138, 143}',
  27: "{'[2M+Na]+', '[M+DMSO+H]+', '[M+H]+', '[M-H2O+H]+', '[M+NH4]+', '[M+Na]+'}",
  28: 266.15178}}
#create and write fig
fig = px.bar(df_plot, y="Strain", x=df_plot.columns[1:], 
        orientation="h", template="simple_white", 
        width=800, height=1000, 
color_discrete_sequence=px.colors.qualitative.Light24)
fig.show()

from those 28 rows, the last six correspond to metadata of the individual variables. is there a way i can use those line in the hoverdata?

enter image description here


Solution

  • The idea would be to unpivot df_plot from wide to long format (see DataFrame.melt()) so that you can then reassign the metadata to their respective variable by adding one column for each metadata :

    df = pd.DataFrame(data)
    
    # Separate variable metadata from sample data
    df_plot = df.iloc[:23, :]
    df_meta = df.iloc[23:, :].astype(str).rename(columns={'Strain': 'metadata'})
    
    # Unpivot df_plot from wide to long format
    df_plot = pd.melt(df_plot, id_vars='Strain')
    
    # Add a column for each metadata
    for index, metadata in df_meta['metadata'].items():
        df_plot[metadata] = df_plot['variable'].map(lambda x: df_meta.at[index, x])
    

    And then you can specify in hover_data the (metadata) columns that will be added in the hover tooltip, eg. adding all of them :

    fig = px.bar(df_plot, y='Strain', x='value', color='variable', orientation='h',
                 hover_data=df_meta['metadata'],
                 template='simple_white', width=800, height=1000,
                 color_discrete_sequence=px.colors.qualitative.Light24)
    fig.show()
    

    output